GORM——查询

检索单个对象

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

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;


// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;


// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;


result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error        // returns error or nil


// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)
如果你想避免ErrRecordNotFound错误,你可以使用Find,
比如db.Limit(1).Find(&user),
Find方法可以接受struct(结构体)和slice(切片)的数据。

对单个对象使用Find而不带limit,db.Find(&user)将会查询整个表,并且只返回第一个对象,只是性能不高并且不确定。

First 和 Last 方法会按主键排序找到第一条记录和最后一条记录 (分别)。 只有在目标 struct 是指针或者通过 db.Model() 指定 model 时,该方法才有效。 此外,如果相关 model 没有定义主键,那么将按 model 的第一个字段进行排序

根据主键检索

如果主键是数字类型,您可以使用 内联条件 来检索对象。 当使用字符串时,需要额外的注意来避免SQL注入;查看 Security 部分来了解详情。

db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;

db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;

db.Find(&users, []int{
   1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);

如果主键是字符串(例如像uuid),查询将被写成如下:

db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
// SELECT * FROM users WHERE id = "1b74413f-f3b8-409f-ac47-e8c062e3472a";

当目标对象有一个主键值时,将使用主键构建查询条件,例如:

var user = User{
   ID: 10}

db.First(&user)
// SELECT * FROM users WHERE id = 10;


var result User

db.Model(User{
   ID: 10}).First(&result)
// SELECT * FROM users WHERE id = 10;
NOTE :如果您使用 gorm 的特定字段类型(例如 gorm.DeletedAt),它将运行不同的查询来检索对象。
type User struct {
   
  ID           string `gorm:"primarykey;size:16"`
  Name         string `gorm:"size:24"`
  DeletedAt    gorm.DeletedAt `gorm:"index"`
}

var user = User{
   ID: 15}
db.First(&user)
//SELECT * FROM `users` WHERE `users`.`id` = '15' AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1

检索全部对象

// Get all records
result := db.Find(&users)

// SELECT * FROM users;
result.RowsAffected // returns found records count, equals `len(users)`
result.Error        // returns error

条件

String 条件

// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;

// Get all matched records
db.Where("name <> ?", "jinzhu").Find(&users)
// SELECT * FROM users WHERE name <> 'jinzhu';

// IN
db.Where("name IN ?", []string{
   "jinzhu", "jinzhu 2"}).Find(&users)
// SELECT * FROM users WHERE name IN ('jinzhu','jinzhu 2');

// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
// SELECT * FROM users WHERE name LIKE '%jin%';

// AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;

// Time
db.Where("updated_at > ?", lastWeek).Find(&users)
// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';

// BETWEEN
db.
### GORM 官方文档与使用教程 官方文档是学习任何框架的最佳起点之一。对于 GORM,其官方文档提供了详尽的内容覆盖从基础安装到高级功能的各个方面[^1]。 #### 1. **GORM 的安装** 要开始使用 GORM,首先需要将其安装至您的项目环境中。可以通过以下命令完成安装: ```bash go get -u gorm.io/gorm go get -u gorm.io/driver/mysql ``` 这些命令分别用于安装核心库 `gorm` 和 MySQL 数据库驱动支持。 #### 2. **基本配置与初始化** 在实际应用中,通常会在项目的根目录下创建一个入口文件(如 `main.go`),并通过它实现数据库连接和其他必要的设置。下面是一个简单的例子: ```go package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) func main() { db, err := gorm.Open("mysql", "root:admin@tcp(localhost:3306)/testgorm?charset=utf8&parseTime=True&loc=Local") if err != nil { fmt.Println(err) panic("failed to connect database") } defer db.Close() // 开启调试模式以查看 SQL 查询日志 db.LogMode(true) fmt.Println("Database connection successful!") } ``` 上述代码展示了如何建立与 MySQL 数据库的连接,并启用查询日志以便于开发阶段排查问题[^2]。 #### 3. **数据更新机制** 当利用结构体 (`struct`) 进行记录更新时,默认情况下仅非零值会被写入数据库。为了更精确地控制哪些字段应该被更新,可以采用两种方式解决此问题:一是通过 `Select()` 方法显式指定待更新字段;二是借助映射表形式传递参数[^3]。 例如,假设我们有一个模型定义如下所示: ```go type User struct { ID uint Name string Age int } ``` 那么针对特定用户的年龄修改操作可表述为: ```go db.Model(&User{}).Where("id = ?", userId).Update("age", newAge) ``` 或者更加灵活的方式——传入键值对集合: ```go updates := map[string]interface{}{ "name": "newName", "age": 25, } db.Model(&User{}).Where("id = ?", userId).Updates(updates) ``` #### 4. **立即执行方法概述** 所谓“立即执行方法”,指的是那些一旦调用就会即时生成并提交对应 SQL 请求给底层存储引擎的行为。这类函数主要包括但不限于增删改查四大类操作中的具体表现形式[^4]。 以下是几个常见的实例演示: - 插入新纪录: ```go user := User{Name: "John Doe", Age: 30} result := db.Create(&user) if result.Error != nil { fmt.Printf("Error occurred while creating user:%v\n", result.Error) } else { fmt.Printf("New record created with ID=%d\n", user.ID) } ``` - 移除现有项: ```go deletedRowsCount := db.Delete(&User{}, userId).RowsAffected fmt.Printf("%d rows were deleted.\n", deletedRowsCount) ``` ### 结论 综上所述,无论是初学者还是有一定经验的技术人员,在探索像 GORM 这样的 ORM 工具过程中都离不开对其官方指南的学习以及实践验证过程中的不断总结积累。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值