文章目录
(。・∀・)ノ゙嗨
User结构体定义、数据库表设计以及Gorm初始化请参考文章 https://mingvvv.blog.csdn.net/article/details/129026914
首先初始化连接池
db := cus_orm.MysqlConnection()
查询单条记录
通过结构体查询对应表
user := &model.User{
}
db.Debug().Take(user) //按照数据库表默认排序
db.Debug().First(user) //按照主键正序 如果没有设置主键 则按照第一个字段排序
db.Debug().Last(user) //按照主键倒序 如果没有设置主键 则按照第一个字段排序
-----------------------------
SELECT * FROM `user` LIMIT 1
SELECT * FROM `user` WHERE `user`.`id` = 521 ORDER BY `user`.`id` LIMIT 1
SELECT * FROM `user` WHERE `user`.`id` = 521 ORDER BY `user`.`id` DESC LIMIT 1
查询后实际上会返回一个 DB 指针类型的结果,DB结构体的内容如下:
type DB struct {
*Config
Error error
RowsAffected int64
Statement *Statement
clone int
}
通过接受这个结果,我们可以提前判断查询是否出现异常,并获取到受影响的行数:
result := db.First(&user)
//判断是不是没有找到任何一条行信息
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
fmt.Println("记录不存在")
}else{
fmt.Println(result.RowsAffected)
}
指定表并将查询一条记录结果放至字典中
data2 := map[string]interface{
}{
}
result := db.Debug().Table("user").Take(&data2)
------------------------------------------
SELECT * FROM `user` LIMIT 1
这样我们就可以随意查询表中的数据,但是要注意的是,指定表名是不能使用 First() 和 Last() 函数,
因为使用这两个方法生成的SQL语句中会自动加入按照模型主键排序的逻辑,又因为上述代码中并没有使用到模型,因此最后的SQL会报错
如下:
db.Debug().Table("user").First(&data2)
----------------------------
SELECT * FROM `user` ORDER BY id,`user`. LIMIT 1
按照主键查询
db.Debug().First(user, 531) //查询主键是 531 的记录
db.Debug().First(user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a") //主键是string时,需要用这种格式
---------------------------------------------------------
SELECT * FROM `user` WHERE `user`.`id` = 531 ORDER BY `user`.`id` LIMIT 1
SELECT * FROM `user` WHERE id = '1b74413f-f3b8-409f-ac47-e8c062e3472a' ORDER BY `user`.`id` LIMIT 1
查询多行记录
按照主键查询
db.Debug().Find(user, []int{
531, 532, 533})
---------------------------------------------------------
SELECT * FROM `user` WHERE `user`.`id` IN (531,532,533)
使用结构体查询
var users []model.User
db.Debug().Find(&users)
------------------------------
SELECT * FROM `user`
指定表名查询并放至字典列表中
var users []map[string]interface{
}
db.Debug().Table("user").Find(&users)
//Scan一定要自己指定表名
db.Debug().Table("user").Scan(&users)
--------------------------------------------
SELECT * FROM `user`
SELECT * FROM `user`
指定查询字段
db.Debug().Select("concat(name,age)", "age").Find(&users)
---------------------------------------
SELECT concat(name,age),`age` FROM `user`
查询条件
Where 条件(=、like、in)
db.Debug().Where("age = ?", 18).Find(&users)
db.Debug().Where("age = ? and name like ?", 18, "%测试%").Find(&users)
db.Debug().Where("name in ?", []string{
"测试goper333", "测试goper222"}).Find(&users)
--------------------------------------------
SELECT * FROM `user` WHERE age = 18
SELECT * FROM `user` WHERE age = 18 and name like '%测试%'
SELECT * FROM `user` WHERE name in ('测试goper333','测试goper222')
Gorm支持在First、Last、FInd方法中添加内嵌查询条件
// Inline 查询条件
db.Debug().Find(&users, "age = ? and name in ?", 18, []string{
"测试goper333", "测试goper222"})
---------------------------------------------
SELECT * FROM `user` WHERE age = 18 and name in ('测试goper333','测试goper222')
通过结构体或字典设置查询条件
db.Debug().Where(&model.User{
Name: "姓名"}).Find(&users)
db.Debug().Where(map[string]interface{
}{
"Name": "姓名"}).Find(&users)
db.Debug().Where([]int{
521, 533}).Find(&users) //默认主键的 in 查询
------------------------------------------
SELECT * FROM `user` WHERE `user`.`name` = '姓名'
SELECT * FROM `user` WHERE `Name` = '姓名'
SELECT * FROM `user` WHERE `user`.`id` IN (521,533)
当使用结构体去设置查询条件的时候我们要注意一点:
零值(0、false、字符串"")不参与SQL组建
即如果我设置了 Age = 0 那个在最后生成的SQL中不会出现 age = 0 这样一行条件 ,如下:
userQ := &model.User{
Name: "姓名", Age: 0}
db.Debug().Where(&userQ).Find(&users)
-----------------------------------
SELECT * FROM `user` WHERE `user`.`name` = '姓名'
如果想要让零值参与SQL查询,我们就要使用字典形式去组建SQL,或者使用Raw方法自己写完整SQL。
var users []model.User
db.Debug().Where(map[string]interface{
}{
"Name": "姓名", "Age": 0}).Find(&users)
db.Debug().Raw("select * from user where name = ? and age = ?", "姓名", 0).Find(&users)
------------------------------------
SELECT * FROM `user` WHERE `Age` = 0 AND `Name` = '姓名'
select * from user where name = '姓名' and age = 0
或
db.Debug().Where("name = '测试'").Or(&model.User{
Name: "goper222", Age: 18}).Or(map[string]interface{
}{
"id": "526"}).Find(&users)
------------------------------
SELECT * FROM `user` WHERE name = '测试' OR (`user`.`name` = 'goper222' AND `user`.`age` = 18) OR `id` = '526'
非
db.Debug().Not("name = ?", "姓名").Find(&users)
db.Debug().Not(model.User{
Name: "姓名", Age: 18}).Find(&users) //使用结构体
db.Debug().Not(map[string]interface{
}{
"Name": "姓名", "Age": 0}).Find(&users) // 使用字典
db.Debug().Not([]int{
521, 533}).Find(&users) //主键非 条件查询
--------------------------------------------
SELECT * FROM `user` WHERE NOT name = '姓名'
SELECT * FROM `user` WHERE (`user`.`name` <> '姓名' AND `user`.`age` <> 18)
SELECT * FROM `user` WHERE (`Age` <> 0 AND `Name` <> '姓名')
SELECT * FROM `user` WHERE `user`.`id` NOT IN (521,533)
排序
db.Debug().Order("age desc,name").Find(&users)
db.Debug().Order("age desc").Order("name").Find(&users)
------------------------------------------------
SELECT * FROM `user` ORDER BY age desc,name
Limit&Offset
db.Debug().Limit(5).Find(&users)
db.Debug().Offset(10).Limit(5).Find(&users)
-------------------------------
SELECT * FROM `user` LIMIT 5
SELECT * FROM `user` LIMIT 5 OFFSET 10
汇总筛选
db.Debug().Select("name").Group("name").Find(&users)
db.Debug().Select("name").Group("name,age").Having("age = 18").Find(&users)
------------------------------------------------
SELECT `name` FROM `user` GROUP BY `name`
SELECT `name` FROM `user` GROUP BY name,age HAVING age = 18
去重
db.Debug().Distinct("name").Find(&users)
------------------------------------------------
SELECT DISTINCT `name` FROM `user`
联合查询
db.Debug().Select("a.*").Joins("a left join user_extend b on a.id = b.user_id").Find(&users)
------------------------------------------------
SELECT a.* FROM `user` a left join user_extend b on a.id = b.user_id