全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 5 分钟 ✍️ juanwangdev

GORM 查询记录基础

GORM 提供多种查询方法,用于按主键、条件获取单条或多条记录。

定义

FirstTakeLast 返回单条记录,Find 返回多条记录,均支持条件与排序。

语法

Go
func (db *DB) First(dest interface{}, conds ...interface{}) (tx *DB)
func (db *DB) Take(dest interface{}, conds ...interface{}) (tx *DB)
func (db *DB) Last(dest interface{}, conds ...interface{}) (tx *DB)
func (db *DB) Find(dest interface{}, conds ...interface{}) (tx *DB)

示例

按主键查询

Go
var user User
db.First(&user, 10) // SELECT * FROM users WHERE id = 10 ORDER BY id LIMIT 1

// 字符串主键
db.First(&user, "uuid-123")

First、Take、Last 区别

方法排序方式说明
First按主键升序获取第一条记录
Last按主键降序获取最后一条记录
Take无排序获取任意一条记录
Go
db.First(&user) // ORDER BY id ASC LIMIT 1
db.Last(&user)  // ORDER BY id DESC LIMIT 1
db.Take(&user)  // LIMIT 1(无排序)

条件查询

Go
// 字符串条件
db.Where("name = ?", "张三").First(&user)

// 结构体条件
db.Where(&User{Name: "张三", Age: 25}).Find(&users)

// Map 条件
db.Where(map[string]interface{}{"name": "张三", "age": 25}).Find(&users)

查询全部

Go
var users []User
db.Find(&users) // SELECT * FROM users

错误处理

Go
result := db.First(&user, 100)
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
    fmt.Println("记录不存在")
}

注意事项

  • FirstLast 自动按主键排序,Take 不排序(性能更高)
  • 查询非零值结构体时,Where 会将零值作为条件,需注意字段类型
  • 未找到记录返回 gorm.ErrRecordNotFound,不算真正的错误
  • 查询多条记录时,目标变量必须是切片类型
  • 字符串主键需显式传入,不能使用 db.First(&user, "id = ?", "uuid")

要点总结

  • First 按主键升序取第一条,Last 降序,Take 无排序
  • Find 返回多条记录,目标为切片类型
  • 支持主键、字符串条件、结构体、Map 多种查询方式
  • 未找到记录返回 gorm.ErrRecordNotFound
  • 无条件 Find 查询全表数据

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 查询条件构建
下一篇 → gorm tag 使用
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库