gorm小记(Ⅲ)| 青训营

57 阅读2分钟

今天用上了Preload来进行多表联查的时候才感觉到学的生疏,到最后还是用的原生查询Raw()方法,总结下来还是没学的扎实,故又开始了复习gorm。

查询

1.基础查询

首先是初见的First,Last,Take方法,他们分别是根据主键查找第一条,最后一条记录和随机查找一条记录。 在这三个方法后面跟一个整数,即表示根据Id单查数据。

// 根据主键查询第一条记录 
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;  

// 查询指定的某条记录(仅当主键为整型时可用) 
db.First(&user, 10) 
//// SELECT * FROM users WHERE id = 10;

这里提醒,在 GORM 中,使用 & 符号是为了将查询的结果赋值给变量的指针。通过使用指针,GORM 可以将查询结果直接填充到变量的内存地址中,而不是复制整个对象。

这样做的好处是可以减少内存的使用,并且能够直接修改变量的值。

接下来是find方法,也就是查询所有记录

// 查询所有的记录 
db.Find(&users) 
//// SELECT * FROM users;  

2.含where查询

where查询一般都是筛选用户想要的数据而使用的,有IN,LIKE,AND,Time,BETWEEN(给自己注释:<> 表示排除该条件的意思)。 以下为案例代码:

// 获取第一个匹配的记录  
db.Where("name = ?", "jinzhu").First(&user)  
//// SELECT * FROM users WHERE name = 'jinzhu' limit 1;  
  
// 获取所有匹配的记录  
db.Where("name = ?", "jinzhu").Find(&users)  
//// SELECT * FROM users WHERE name = 'jinzhu';  
  
// <>  
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';

在 GORM 中,NOT 是用于添加否定条件的关键字。它可以与其他条件一起使用,以求取不满足给定条件的记录。

下面是主要示例,展示多种情况下用到除此条件的查询:

db.Not("name", "jinzhu").First(&user)  
//// SELECT * FROM users WHERE name <> "jinzhu" ORDER BY id LIMIT 1;  
  
// Not In  
db.Not("name", []string{"jinzhu", "jinzhu 2"}).Find(&users)  
//// SELECT * FROM users WHERE name NOT IN ("jinzhu", "jinzhu 2");  
  
// 不在主键切片中  
db.Not([]int64{1,2,3}).First(&user)  
//// SELECT * FROM users WHERE id NOT IN (1,2,3) ORDER BY id LIMIT 1;  
  
db.Not([]int64{}).First(&user)  
//// SELECT * FROM users ORDER BY id LIMIT 1;  
  
// 普通 SQL  
db.Not("name = ?", "jinzhu").First(&user)  
//// SELECT * FROM users WHERE NOT(name = "jinzhu") ORDER BY id LIMIT 1;  
  
// Struct  
db.Not(User{Name: "jinzhu"}).First(&user)  
//// SELECT * FROM users WHERE name <> "jinzhu" ORDER BY id LIMIT 1;

or则就是或查询了,扩大查询条件区间使用。

//通常
db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&users)  
//// SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';  
// Struct  
db.Where("name = 'jinzhu'").Or(User{Name: "jinzhu 2"}).Find(&users)  
//// SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';
// Map  
db.Where("name = 'jinzhu'").Or(map[string]interface{}{"name": "jinzhu 2"}).Find(&users)  
//// SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';