GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
04_GORM查询操作_哔哩哔哩_bilibili
前置:
db调用操作语句中间加debug()可以显示对应的sql语句
1.Gorm模型定义(理解重点)
02_GORM模型定义那些事儿_哔哩哔哩_bilibili
模型定义 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
1)
2)结构体可以指定tag对应到数据库里的字段名称
3)一些tag
4)默认ID作主键,也可以用tag指定
5)表名,默认结构体名字+s,可以指定
可以用func TableName()返回指定表名或者Table()
6)列名
7)三个时间戳标签
有model的就会自动嵌入,专门记录创建修改和删除的时间戳。
软删除:DeletedAt设置为当前时间表示软删除,并不是真正删除数据,相当于保护了数据完整性。查询来的时候会发现DeletedAt有值默认逻辑删除了
2.数据库连接
获取一个db代表这个数据库,后续可以利用db进行数据库操作
3.迁移表
会自动把传入的数据类型与数据库的表格对应起来,如果有结构体变化会更改表格结构。
gorm模型和表格对应关系
4.增添
Create()传入结构体和结构体指针都可以,但是一般指针比较小。
NewRecord()判断主键对应的对象是否已经在数据库里存在,会造成冲突
1)默认值
结构体后面反引号`gorm:"default:‘xxx’ " `
5.删除
1)单个删除或者全删
删除该类型对应表里和主键id一样的记录
tips:警告删除记录时,请确保主键字段有值,GORM 会通过主键去删除记录,如果主键为空,GORM会删除该model的所有记录。
2)符合条件的批量删除
3)软删除
4)物理删除
6.修改
1)更新所有字段
2)改指定字段
update和updates的区别是更新一个还是多个字段
3)更新或忽略某些字段
7.查找
1)一般
为什么传地址?因为你要查询出结果,查询结果会放在传进去的参数里,而不是放返回值里。
而且这一条只限于主键id为int类型的才能获取。
这里传入的是一个slice指针,获取一组数据
db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;
db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;
db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);
// 获取第一条记录(主键升序)
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
// Get all records
result := db.Find(&users)
2)where
查询 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
都是在查询前面插入一个where函数写条件
// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;
// Get all matched records
db.Where("name <> ?", "jinzhu").Find(&users)
// SELECT * FROM users WHERE name <> 'jinzhu';
// IN
db.Where("name IN ?", []string{"jinzhu", "jinzhu 2"}).Find(&users)
// SELECT * FROM users WHERE name IN ('jinzhu','jinzhu 2');
// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
// SELECT * FROM users WHERE name LIKE '%jin%';
// AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;
// Time
db.Where("updated_at > ?", lastWeek).Find(&users)
// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';
// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';