gorm学习 | 青训营笔记

90 阅读3分钟
  • 这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
  • 1. 查询一个对象

查询一个对象主要有三个方法:

  1. First:按照主键升序排列,返回第一个对象:SELECT * FROM TableName ORDER BY PrimaryKeyName LIMIT 1,这个limit 1表示限制只查询一条数据,这样可以避免整个表的遍历

  2. Last:按照主键降序排列,返回第一个对象:SELECT * FROM TableName ORDER BY PrimaryKeyName DESC LIMIT 1

  3. 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

选出所有不同的记录

11. Joins用于连接