GORM框架的使用 | 青训营笔记

109 阅读2分钟

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

这篇笔记复习了GORM框架在go语言中的使用方法。

GORM框架是golang语言中非常流行的ORM库,拥有强大而便捷的功能。

模型定义

模型是标准的 struct,例如:

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.Model 结构体,其包括字段 IDCreatedAtUpdatedAtDeletedAt

type Model struct {
  ID uint `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

创建

创建一个新的User记录:

user := User{Name: "zhangsan", Age: 22, Sex:"male"}  
  
result := db.Create(&user) // 通过数据的指针来创建  
 
user.ID             // 返回插入数据的主键  
result.Error        // 返回 error  
result.RowsAffected // 返回插入记录的条数

创建记录并更新给出的字段:

db.Select("Name", "Age", "Sex").Create(&user)

上述语句就相当于sql语句:

INSERT INTO users (name,age,sex) VALUES ("jinzhu", 18, "male")

查询

检索单个对象

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

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1; 这里Limit1指的就是user变量的条件,下面相同

// 获取一条记录,没有指定排序字段
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)

检索全部对象

// Get all records  
result := db.Find(&users)  
// SELECT * FROM users;  
  
result.RowsAffected // returns found records count, equals `len(users)`  
result.Error        // returns error

更新

保存

Save 会保存所有的字段,即使字段是零值

更新单个列

当使用 Update 更新单列时,需要有一些条件,否则将会引起错误 ErrMissingWhereClause

// 条件更新  
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;

更新多个列

Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段

// 根据 `struct` 更新属性,只会更新非零值的字段
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;

// 根据 `map` 更新属性
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello', age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

删除

删除一条记录时,删除对象需要指定主键,否则会触发批量 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";

总结

以上就是我总结的gorm框架用golang语言简单操作数据库的内容。本人水平有限,如有错误欢迎指正