GORM(二) | 青训营笔记

77 阅读2分钟

创建数据

使用db.Create方法,传入结构体的指针创建

sql
复制代码
user := User{UserName: "l", Password: "ddd"}
result := db.Create(&user)

插入后返回的常用数据

arduino
复制代码
fmt.Println("ID:", user.ID)                       // 插入的主键
fmt.Println("error:", result.Error)               // 返回的 error
fmt.Println("rowsAffected:", result.RowsAffected) // 插入的条数

只插入指定字段

sql
复制代码
user := User{UserName: "lzq", Password: "ccc"}
result := db.Select("UserName").Create(&user)

不插入指定字段: result :=db.Omit("UserName").Create(&user)

批量插入

css
复制代码
users := []User{
    {UserName: "lzq", Password: "aaa"},
    {UserName: "qqq", Password: "bbb"},
    {UserName: "gry", Password: "ccc"},
}
db.Create(&users)

分批批量插入

如果插入的数量非常大,那么可以使用CreateInBatches方法分批次插入

css
复制代码
users := []User{
    {UserName: "lzq", Password: "aaa"},
    {UserName: "qqq", Password: "bbb"},
    {UserName: "gry", Password: "ccc"},
    {UserName: "lzq", Password: "aaa"},
    {UserName: "qqq", Password: "bbb"},
    {UserName: "gry", Password: "ccc"},
}
​
db.CreateInBatches(&users, 2)//每次插入两条

查询数据

查询单个对象

First:主键升序

Take:不排序

Last:主键降序

如果没有查询到对象,那么会返回ErrRecordNotFound错误

根据主键查询

在 First/Take/Last 等函数中设置第二个参数,该参数被认作是 ID,可以选择 int 或 string 类型

查询多个对象

bash
复制代码
users := []User{}
result := db.Find(&users)

使用Find查询多条数据,如果查询不到不会返回错误

设置查询条件

gorm 提供了Where 方法,可以实现 =、<>、IN、LIKE、AND、>、<、BETWEEN 等方法,使用 ? 来占位

sql
复制代码
db.Where("name = ?", "l").First(&user)
// SELECT * FROM users WHERE user_name = 'l' ORDER BY id LIMIT 1;
​
// 获取全部匹配的记录
db.Where("name <> ?", "l").Find(&users)
// SELECT * FROM users WHERE user_name <> 'l';
​
// IN
db.Where("name IN ?", []string{"lzq", "qqq"}).Find(&users)
// SELECT * FROM users WHERE user_name IN ('lzq','qqq');
​
// LIKE
db.Where("name LIKE ?", "%l%").Find(&users)
// SELECT * FROM users WHERE user_name LIKE '%l%';
​
// AND
db.Where("name = ? AND age = ?", "lzq", "aaa").Find(&users)
// SELECT * FROM users WHERE user_name = 'lzq' AND password = aaa;
​
// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM users WHERE created_at BETWEEN '2020-11-01 00:00:00' AND '2020-11-08 00:00:00';

Where快速设置条件的方法

传递 Struct、Map 和 切片时,可以实现更简便的设置条件

php
复制代码
db.Where(&User{UserName:"lzq", Password:"aaa"}).Find(&user)
db.Where(map[string]interface{}{"user_name": "lzq", "password": "aaa"}).Find(&user)
db.Where([]int{10, 11}).Find(&user)//切片时查询主键

当使用结构体作为查询条件时,GORM只会查询非零值字段

作者:梦晓Devil
链接:juejin.cn/post/719370…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。