- 这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
-
1. 查询一个对象
查询一个对象主要有三个方法:
-
First:按照主键升序排列,返回第一个对象:
SELECT * FROM TableName ORDER BY PrimaryKeyName LIMIT 1,这个limit 1表示限制只查询一条数据,这样可以避免整个表的遍历 -
Last:按照主键降序排列,返回第一个对象:
SELECT * FROM TableName ORDER BY PrimaryKeyName DESC LIMIT 1 -
Take:没有按照主键升序或者降序的要求,只是选出表中的第一条数据
First和Last方法没有找到的话会返回ErrRecordNotFound方法,并且必须传递指针变量的引用
如果想不报这个错误的话,可以使用Find方法,并且通过Limit()方法限制查询条数,不然的话就会查询整个表,导致性能不佳。
First和Last必须要指定查询对象的主键ID,不然是执行不了的,Take就不需要,只需要指定表就OK了。这就说明了使用Map接收对象的时候注意要指定Model,只指定一个Table是没有用的。
如果没有在结构体中指定主键的话,默认就是第一个字段作为主键
2. 通过主键查找对象
1. 赋值对象没有主键值
// 1. 主键值是数字
db.First(&user, 10)
// 2. 主键值是字符串,这个时候需要注意到可能会有字符串注入的问题s
db.First(&user, "10")
// 3. 集合查找
users := []User{}
db.First(&users, []int{1, 2, 3})
// 4. 主键字符串很长
db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
2. 赋值对象有主键值
// 可以这样
user := User{"ID": 10}
db.First(&user)
// 还可以通过Model直接指定
db.Model(&User{"ID": 10}).First(&user)
3. 查询所有对象
直接赋值给切片就行了,比较简单这里就不再赘述了
4. 条件查询
1. where方法
例如:db.Where("age > ?", 20).Find(&users)
2. struct、map条件传递
struct:db.Where(&User{"Name": "zhangsan", "Age": 12}).First(&user)
map:db.Where(map[string]interface{}{"Name": "zhangsan", "Age": 12}).Find(&users)
默认主键切片:db.Where([]int{1, 2, 3}).Find(&users)
需要注意的就是0,nil,'',false这类的值被作为结构体查询条件的时候是不会被作为条件传递的,但是做为map的时候是可以传递的
3. 上面的这两种全部都可以内嵌
举个栗子:db.First(&user, "age > ?", 20)
4. Not关键字
5. Or关键字
6. 选择特定的关键字
db.Select("name", "age").Find(&users)
db.Select([]string{"name", "age"}).Find(&users)
7. Order关键字
db.Order("age desc, name").Find(&users)
db.Order("age desc").Order("name").Find(&users)
8. Limit限制查询条数和偏移量
从数据库中查询三条记录:db.Limit(3).Find(&users)实际上就是查询前三条
甚至还可以链式写:db.Limit(10).Find(&user1).Limit(-1).Find(&user2)这样可以得到两个查询结果
offset是指定偏移量的,比如说:db.Offset(3).Find(&users)就表示跳过前面三个记录,返回后面的所有记录
9. GroupBy和Having
....
10. Distinct
选出所有不同的记录