GORM 提供了多种查询方法,以下是常用查询方法的详细说明:
基础查询方法
1. First() - 查询第一条记录
govar user User db.First(&user) // SELECT * FROM users ORDER BY id LIMIT 1 db.First(&user, 10) // SELECT * FROM users WHERE id = 10
2. Last() - 查询最后一条记录
govar user User db.Last(&user) // SELECT * FROM users ORDER BY id DESC LIMIT 1
3. Find() - 查询多条记录
govar users []User db.Find(&users) // SELECT * FROM users db.Find(&users, []int{1, 2, 3}) // SELECT * FROM users WHERE id IN (1, 2, 3)
4. Take() - 获取一条记录,不指定排序
govar user User db.Take(&user) // SELECT * FROM users LIMIT 1
条件查询
Where() - 添加查询条件
godb.Where("name = ?", "John").First(&user) db.Where("name = ? AND age >= ?", "John", 18).Find(&users) db.Where(map[string]interface{}{"name": "John", "age": 30}).First(&user) db.Where(&User{Name: "John"}).First(&user)
高级查询
链式查询
godb.Where("age > ?", 18). Order("age DESC"). Limit(10). Offset(5). Find(&users)
Or 条件
godb.Where("name = ?", "John").Or("name = ?", "Jane").Find(&users)
Not 条件
godb.Not("name = ?", "John").Find(&users)
In 查询
godb.Where("id IN ?", []int{1, 2, 3}).Find(&users)
Like 查询
godb.Where("name LIKE ?", "%John%").Find(&users)
Between 查询
godb.Where("age BETWEEN ? AND ?", 18, 30).Find(&users)
排序和分页
Order() - 排序
godb.Order("age DESC").Find(&users) db.Order("age DESC, name ASC").Find(&users)
Limit() - 限制记录数
godb.Limit(10).Find(&users)
Offset() - 偏移量
godb.Offset(10).Limit(10).Find(&users) // 分页查询
选择特定字段
Select() - 选择字段
godb.Select("name", "email").Find(&users) db.Select("name, email").Find(&users)
聚合查询
Count() - 计数
govar count int64 db.Model(&User{}).Where("age > ?", 18).Count(&count)
Pluck() - 提取单列
govar names []string db.Model(&User{}).Pluck("name", &names)
原生 SQL
Raw() - 执行原生 SQL
godb.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)
Exec() - 执行原生 SQL(不返回数据)
godb.Exec("UPDATE users SET age = age + 1 WHERE id = ?", 1)
注意事项
- First() vs Take(): First() 会按主键排序,Take() 不排序
- 查询条件: 使用参数化查询(?)防止 SQL 注入
- 性能优化: 合理使用索引、限制查询字段、避免 N+1 查询
- 错误处理: 检查
db.Error来处理查询错误 - 预加载: 使用 Preload() 避免关联查询的性能问题