Gorm框架常用操作记录 | 青训营笔记

134 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
本文将基于gorm文档介绍gorm框架的常用操作。

模型定义

type User struct {
  ID           uint
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivatedAt  sql.NullTime
  CreatedAt    time.Time
  UpdatedAt    time.Time
}

约定

GORM 倾向于约定优于配置 默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAtUpdatedAt 字段追踪创建、更新时间

创建记录

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}

result := db.Create(&user) // 通过数据的指针来创建

user.ID             // 返回插入数据的主键
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数

检索单个对象

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误

// 获取第一条记录(主键升序)  
db.First(&user)  
// SELECT * FROM users ORDER BY id LIMIT 1;  
  
// 获取一条记录,没有指定排序字段  
db.Take(&user)  
// SELECT * FROM users LIMIT 1;  
  
// 获取最后一条记录(主键降序)  
db.Last(&user)  
// SELECT * FROM users ORDER BY id DESC LIMIT 1;  
  
result := db.First(&user)  
result.RowsAffected // 返回找到的记录数  
result.Error // returns error or nil  
  
// 检查 ErrRecordNotFound 错误  
errors.Is(result.Error, gorm.ErrRecordNotFound)

更新单个列

当使用 Update 更新单列时,需要有一些条件,否则将会引起错误 ErrMissingWhereClause ,当使用 Model 方法,并且值中有主键值时,主键将会被用于构建条件,例如:

// 条件更新  
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")  
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;  
  
// User 的 ID 是 `111`  
db.Model(&user).Update("name", "hello")  
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;  
  
// 根据条件和 model 的值进行更新  
db.Model(&user).Where("active = ?", true).Update("name", "hello")  
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;

删除一条记录

删除一条记录时,删除对象需要指定主键,否则会触发批量 Delete

// Email 的 ID 是 `10`  
db.Delete(&email)  
// DELETE from emails where id = 10;  
  
// 带额外条件的删除  
db.Where("name = ?", "jinzhu").Delete(&email)  
// DELETE from emails where id = 10 AND name = "jinzhu";

原生 SQL

type Result struct {  
ID int  
Name string  
Age int  
}  
  
var result Result  
db.Raw("SELECT id, name, age FROM users WHERE name = ?", 3).Scan(&result)  
  
db.Raw("SELECT id, name, age FROM users WHERE name = ?", 3).Scan(&result)  
  
var age int  
db.Raw("SELECT SUM(age) FROM users WHERE role = ?", "admin").Scan(&age)  
  
var users []User  
db.Raw("UPDATE users SET name = ? WHERE age = ? RETURNING id, name", "jinzhu", 20).Scan(&users)