Gorm 使用笔记 | 青训营笔记

104 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

今日记录一下项目中 Gorm 的使用。

环境配置:

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

连接数据库设置 parseTime 从而正确解析数据库的时间类型为 time.Time,使用 loc=Local 可以确定项目使用的时区,参考:

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{})

声明模型时使用注解进行更详细的配置,例如:

type User struct {
   ID            int64     `gorm:"primaryKey"`
   Name          string    `gorm:"index:idx_name,unique;type:varchar(20)"`
   Password      string    `gorm:"type:varchar(20)"`
   FollowCount   int64     `gorm:"default:0"`
   FollowerCount int64     `gorm:"default:0"`
   IsDel         bool
   CreatedAt     time.Time `gorm:"column:created_at;type:TIMESTAMP;default:CURRENT_TIMESTAMP;<-:create" json:"created_at,omitempty"`
   UpdateAt      time.Time `gorm:"column:update_at;type:TIMESTAMP;default:CURRENT_TIMESTAMP  on update current_timestamp" json:"update_at,omitempty"`
}

Gorm 会自动地将结构体名的蛇形复数作为表明,这里解析为users,对结构体成员的解析会根据蛇形对应,比如 FollowCount 会对应 follow_count,但 ID 会直接对应 id;代码中设置为 string 类型的成员会被 Gorm 默认映射为 longtext 类型,并且因为 MySQL 中没有 bool 类型,所以代码中的 bool 类型会映射为 tinyint 类型,因此查询的时候如果将参数写在语句里要注意写成 0 或 1,如果使用 Gorm 语句填充参数则依旧按照 bool 类型即可。

对于自定义类型,只要实现对应的 Scanner/Valuer 接口就可以直接使用 Gorm 进行存取,这个如果用到的话可以找一下相关的文档。

初始数据库为空的时候可以通过 Gorm 的 AutoMigrate 等方法根据已有的 Model 自动生成表结构:

db.AutoMigrate(&db.User{})

之后进行 SQL 操作的大致顺序如下:

  1. 使用 Model 或者 Table 确定语句执行的表名
  2. 使用 Where 确定查询逻辑和参数
  3. 使用 Find 返回结果,并且如果查询条件是主键,可以把参数设置在这里;使用 First 也可以返回结果,但是会只返回结果中的第一条,而且如果没有查询到的话会返回一个 error ,Find 查不到也会返回空数据

对于不支持链式操作的语句可以使用 Raw 执行。