这是我参与「第五届青训营 」伴学笔记创作活动的第 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 操作的大致顺序如下:
- 使用
Model或者Table确定语句执行的表名 - 使用
Where确定查询逻辑和参数 - 使用
Find返回结果,并且如果查询条件是主键,可以把参数设置在这里;使用First也可以返回结果,但是会只返回结果中的第一条,而且如果没有查询到的话会返回一个 error ,Find查不到也会返回空数据
对于不支持链式操作的语句可以使用 Raw 执行。