记录一下实现大项目的过程中,使用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提供了First、Take、Last方法,以便从数据库中检索单个对象,但没有找到记录时,它会返回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;