GORM 查询记录基础
GORM 提供多种查询方法,用于按主键、条件获取单条或多条记录。
定义
First、Take、Last 返回单条记录,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("记录不存在")
}
注意事项
First和Last自动按主键排序,Take不排序(性能更高)- 查询非零值结构体时,
Where会将零值作为条件,需注意字段类型- 未找到记录返回
gorm.ErrRecordNotFound,不算真正的错误- 查询多条记录时,目标变量必须是切片类型
- 字符串主键需显式传入,不能使用
db.First(&user, "id = ?", "uuid")
要点总结
First按主键升序取第一条,Last降序,Take无排序Find返回多条记录,目标为切片类型- 支持主键、字符串条件、结构体、Map 多种查询方式
- 未找到记录返回
gorm.ErrRecordNotFound - 无条件
Find查询全表数据
📝 发现内容有误?点击此处直接编辑