官方文档
https://gorm.io/zh_CN/docs/query.html

一、检索单个对象

GORM提供了 FisrtTakeLast方法,来方便从数据库中检索单个对象
当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误

  1. // 获取第一条记录(主键升序)
  2. db.First(&user)
  3. // SELECT * FROM users ORDER BY id LIMIT 1;
  4. // 获取一条记录,没有指定排序字段
  5. db.Take(&user)
  6. // SELECT * FROM users LIMIT 1;
  7. // 获取最后一条记录(主键降序)
  8. db.Last(&user)
  9. // SELECT * FROM users ORDER BY id DESC LIMIT 1;
  10. result := db.First(&user)
  11. result.RowsAffected // 返回找到的记录数
  12. result.Error // returns error or nil
  13. // 检查 ErrRecordNotFound 错误
  14. errors.Is(result.Error, gorm.ErrRecordNotFound)

二、使用主键进行检索

如果主键是数字类型,您可以使用 内联条件 来检索对象。 传入字符串参数时,需要特别注意 SQL 注入问题,查看 安全 获取详情.

  1. db.First(&user, 10)
  2. // SELECT * FROM users WHERE id = 10;
  3. db.First(&user, "10")
  4. // SELECT * FROM users WHERE id = 10;
  5. db.Find(&users, []int{1,2,3})
  6. // SELECT * FROM users WHERE id IN (1,2,3);

image.png
执行的SQL语句就是 select * from users where id = "123456"

三、检索全部对象

先需要在go中准备好对应实体类的切片 var userList []dao.User
然后调用Find方法,并把切片作为参数传入进去,使用 result接收检索的结果

  1. func GetAllUser() (int, string, []dao.User) {
  2. var userList []dao.User
  3. result := dao.GormDB.Table("user").Find(&userList)
  4. if result.Error != nil {
  5. return 4000, result.Error.Error(), userList
  6. }
  7. return 5000, "success", userList
  8. }

检索的结果
image.png

  1. // 获取全部记录
  2. result := db.Find(&users)
  3. // SELECT * FROM users;
  4. result.RowsAffected // 返回找到的记录数,相当于 `len(users)`
  5. result.Error // returns error

四、字符串条件

相当于自己写查询MySQL的语句

  1. // 获取第一条匹配的记录
  2. db.Where("name = ?", "jinzhu").First(&user)
  3. // SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;
  4. // 获取全部匹配的记录
  5. db.Where("name <> ?", "jinzhu").Find(&users)
  6. // SELECT * FROM users WHERE name <> 'jinzhu';
  7. // IN
  8. db.Where("name IN ?", []string{"jinzhu", "jinzhu 2"}).Find(&users)
  9. // SELECT * FROM users WHERE name IN ('jinzhu','jinzhu 2');
  10. // LIKE
  11. db.Where("name LIKE ?", "%jin%").Find(&users)
  12. // SELECT * FROM users WHERE name LIKE '%jin%';
  13. // AND
  14. db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
  15. // SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;
  16. // Time
  17. db.Where("updated_at > ?", lastWeek).Find(&users)
  18. // SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';
  19. // BETWEEN
  20. db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
  21. // SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';