Gorm -- 查询记录


(。・∀・)ノ゙嗨
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

猜你喜欢

转载自blog.csdn.net/qq_40096897/article/details/129387399
今日推荐