GORM基础学习记录文档

161 阅读4分钟

GORM 基础

安装 GORM

首先,你需要安装 GORM。在你的 Go 项目中运行以下命令:

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

这里我们使用了 SQLite 作为示例数据库,你也可以选择 MySQL、PostgreSQL 等其他数据库。

定义模型

定义一个 Go 结构体来表示数据库中的表。例如,我们定义一个 User 模型:

package main

import (
    "gorm.io/gorm"
)

type User struct {
    gorm.Model
    Name  string
    Email string `gorm:"type:varchar(100);uniqueIndex"`
    Age   int
}

这里 gorm.Model 是 GORM 的内置模型,包含了 ID、CreatedAt、UpdatedAt、DeletedAt 等字段。

连接数据库

使用 GORM 连接到数据库:

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // 迁移模式
    db.AutoMigrate(&User{})
}

增删改查操作

创建(Create)

创建一个新的记录:

func main() {
    // 省略连接数据库的代码

    // 创建用户
    user := User{Name: "John Doe", Email: "johndoe@example.com", Age: 30}
    db.Create(&user)

    // 查询并打印创建的用户
    var user1 User
    db.First(&user1, user.ID)
    println(user1.Name)
}

查询(Read)

查询数据库中的记录:

func main() {
    // 省略连接数据库的代码

    // 查询所有用户
    var users []User
    db.Find(&users)

    // 查询特定用户
    var user User
    db.First(&user, 1) // 根据ID查询
    db.First(&user, "name = ?", "John Doe") // 根据条件查询
}

更新(Update)

更新记录:

func main() {
    // 省略连接数据库的代码

    // 更新用户
    db.Model(&user).Update("Age", 31)
    db.Model(&user).Updates(User{Age: 40, Email: "newemail@example.com"})
}

删除(Delete)

删除记录:

func main() {
    // 省略连接数据库的代码

    // 删除用户
    db.Delete(&user, 1)
}

事务

GORM 也支持事务操作:

func main() {
    // 省略连接数据库的代码

    tx := db.Begin()
    if tx.Error != nil {
        tx.Rollback()
        return
    }

    if err := tx.Create(&user).Error; err != nil {
        tx.Rollback()
        return
    }

    tx.Commit()
}

关联

GORM 支持一对一、一对多、多对多的关联:

type Profile struct {
    gorm.Model
    User  User
    Value string
}

func main() {
    // 省略连接数据库的代码

    // 创建用户和关联的 Profile
    db.Create(&User{Name: "Jane Doe", Email: "janedoe@example.com"})
    db.Model(&User{Name: "Jane Doe"}).Association("Profile").Append(&Profile{Value: "Jane's profile"})
}

钩子(Hooks)

GORM 支持在数据库操作前后执行自定义逻辑:

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
    u.CreatedAt = time.Now()
    u.UpdatedAt = time.Now()
    return nil
}

func main() {
    // 省略连接数据库的代码

    db.Create(&User{Name: "John Doe", Email: "johndoe@example.com"})
}

GORM高级特性

GORM 提供了许多高级特性,可以帮助开发者更高效地进行数据库操作。以下是一些值得学习的 GORM 高级特性:

  1. 多数据库支持:GORM 支持多种数据库,如 MySQL、PostgreSQL、SQLite 等,使用统一的 API 进行操作 。
  2. 关联(Relationships):GORM 支持多种关联类型,包括一对一(Has One)、一对多(Has Many)、多对多(Many To Many)等 。
  3. 预加载(Preload):GORM 支持预加载关联数据,以避免 N+1 查询问题,提高性能 。
  4. 事务处理:GORM 提供了事务支持,包括嵌套事务、保存点和回滚到保存点 。
  5. 上下文(Context):GORM 支持使用 Context 进行数据库操作,这有助于处理超时和取消操作 。
  6. 批量操作:GORM 支持批量插入、批量查询等操作,可以提高大量数据处理的效率 。
  7. SQL 构建器:GORM 提供了一个强大的 SQL 构建器,可以构建复杂的查询 。
  8. 复合主键支持:GORM 支持复合主键,允许你在一个表中有多个主键 。
  9. 索引和约束:GORM 允许你定义索引和数据库约束,以优化查询性能和保证数据完整性 。
  10. 自动迁移(Auto Migration):GORM 可以自动迁移数据库模式,简化数据库结构的更新 。
  11. 自定义 Logger:GORM 允许自定义日志记录器,以满足不同的日志需求 。
  12. 插件系统:GORM 提供了一个灵活的插件系统,如数据库解析器(Database Resolver)和 Prometheus 集成 。
  13. 命名策略:GORM 允许通过覆盖默认的命名策略来更改默认的命名约定,包括表名、字段名等 。
  14. 乐观锁:GORM 支持乐观锁,可以在并发环境下保证数据的一致性 。
  15. 字段权限:GORM 支持字段权限控制,如只读、只写、只创建、只更新、忽略等 。
  16. 自定义类型:GORM 优化了对自定义类型的支持,允许定义一个 struct 来支持所有类型的数据库 。
  17. Smart Select:GORM 允许通过选择指定的字段来优化查询,减少数据传输 。