乐闻世界logo
搜索文章和话题

GORM 中常用的查询方法有哪些?

3月6日 21:37

GORM 提供了多种查询方法,以下是常用查询方法的详细说明:

基础查询方法

1. First() - 查询第一条记录

go
var 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() - 查询最后一条记录

go
var user User db.Last(&user) // SELECT * FROM users ORDER BY id DESC LIMIT 1

3. Find() - 查询多条记录

go
var 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() - 获取一条记录,不指定排序

go
var user User db.Take(&user) // SELECT * FROM users LIMIT 1

条件查询

Where() - 添加查询条件

go
db.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)

高级查询

链式查询

go
db.Where("age > ?", 18). Order("age DESC"). Limit(10). Offset(5). Find(&users)

Or 条件

go
db.Where("name = ?", "John").Or("name = ?", "Jane").Find(&users)

Not 条件

go
db.Not("name = ?", "John").Find(&users)

In 查询

go
db.Where("id IN ?", []int{1, 2, 3}).Find(&users)

Like 查询

go
db.Where("name LIKE ?", "%John%").Find(&users)

Between 查询

go
db.Where("age BETWEEN ? AND ?", 18, 30).Find(&users)

排序和分页

Order() - 排序

go
db.Order("age DESC").Find(&users) db.Order("age DESC, name ASC").Find(&users)

Limit() - 限制记录数

go
db.Limit(10).Find(&users)

Offset() - 偏移量

go
db.Offset(10).Limit(10).Find(&users) // 分页查询

选择特定字段

Select() - 选择字段

go
db.Select("name", "email").Find(&users) db.Select("name, email").Find(&users)

聚合查询

Count() - 计数

go
var count int64 db.Model(&User{}).Where("age > ?", 18).Count(&count)

Pluck() - 提取单列

go
var names []string db.Model(&User{}).Pluck("name", &names)

原生 SQL

Raw() - 执行原生 SQL

go
db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)

Exec() - 执行原生 SQL(不返回数据)

go
db.Exec("UPDATE users SET age = age + 1 WHERE id = ?", 1)

注意事项

  1. First() vs Take(): First() 会按主键排序,Take() 不排序
  2. 查询条件: 使用参数化查询(?)防止 SQL 注入
  3. 性能优化: 合理使用索引、限制查询字段、避免 N+1 查询
  4. 错误处理: 检查 db.Error 来处理查询错误
  5. 预加载: 使用 Preload() 避免关联查询的性能问题
标签:Gorm