GORM实践 | 青训营

61 阅读2分钟

记录一下实现大项目的过程中,使用GORM的过程。

连接数据库

首先需要安装数据库驱动以及GORM依赖,以MySQL为例

go get gorm.io/driver/mysql
go get gorm.io/gorm

连接数据库只需要一行代码,但我们需要先给出数据源地址,为了正确处理time.Time,需要带上parseTime参数,要支持完整的UTF-8编码,需要设置charset=utf8mb4

dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) 

定义模型

GORM倾向于约定大于配置,默认情况下,GORM使用结构体名的蛇形命名作为表名。对于结构体User,根据约定,其表名为users。想要自定义表名,可以实现Tabler接口来更改默认表名,例如

type Tabler interface {
    TableName() string
}

// TableName 会将 User 的表名重写为 `profiles`
func (User) TableName() string {
  return "profiles"
}

GORM使用ID作为主键,也可以通过给字段设置gorm:"primaryKey"自定义主键。对于列名同样使用的时结构体字段的蛇形命名,也可以使用column标签来自定义。

type User struct {
  ID int64     `gorm:"column:user_id"`         // 将列名设为 `user_id`
  Name time.Time `gorm:"column:username"` // 将列名设为 `username`
}

插入

GORM使用Create方法来插入数据

user := User{ID: 1, Name: "jack"}
result := db.Create(&user)
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数

如需批量插入,只需要将传入的指针改为数组指针,GORM会生成一个单一的SQL语句来插入所有数据。

查询

检索单个对象

GORM提供了FirstTakeLast方法,以便从数据库中检索单个对象,但没有找到记录时,它会返回ErrRecordNotFound错误。

检索多个对象

使用Find方法来检索所有满足条件的对象

// 获取全部记录
result := db.Find(&users)
// SELECT * FROM users;

result.RowsAffected // 返回找到的记录数,相当于 `len(users)`
result.Error        // returns error

删除

GORM使用Delete方法删除一条记录,删除需要指定主键,否则会触发批量删除

// user.ID = 1
db.Delete(&user)
// DELETE from user where id = 1

修改

GORM使用Update更新

// User 的 ID 是 `111`
db.Model(&user).Update("name", "hello")
// UPDATE users SET name='hello' WHERE id=111;