12-高级查询 智能选择字段在 GORM 中,您可以使用 Select 方法有效地选择特定字段。这在 Model 字段较多但只需要其中部分的时候尤其有用,比如编写API响应。 12345678910111213141516type User struct { ID uint Name string Age int Gender string // 很多很多字段}ty 2024-12-04 Go #Go
13-更新 Save 保存所有字段Save 会保存所有的字段,即使字段是零值 123456db.First(&user)user.Name = "jinzhu 2"user.Age = 100db.Save(&user)// UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013- 2024-12-04 Go #Go
14-删除 删除一条记录删除一条记录时,删除对象需要指定主键,否则会触发 批量删除,例如: 1234567// Email 的 ID 是 `10`db.Delete(&email)// DELETE from emails where id = 10;// 带额外条件的删除db.Where("name = ?", "jinzhu").Delete(&email)// DELETE from e 2024-12-04 Go #Go
15-原生 SQL 和 SQL 生成器 https://gorm.io/zh_CN/docs/sql_builder.html 原生 SQL原生查询 SQL 和 Scan12345678910111213141516type Result struct { ID int Name string Age int}var result Resultdb.Raw("SELECT id, name, age 2024-12-04 Go #Go
21-belongs_to Belongs Tobelongs to 会与另一个模型建立了一对一的连接。 这种模型的每一个实例都“属于”另一个模型的一个实例。 例如,您的应用包含 user 和 company,并且每个 user 能且只能被分配给一个 company。下面的类型就表示这种关系。 注意,在 User 对象中,有一个和 Company 一样的 CompanyID。 默认情况下, CompanyID 被隐含地用来在 2024-12-04 Go #Go
22-has_one Has Onehas one 与另一个模型建立一对一的关联,但它和一对一关系有些许不同。 这种关联表明一个模型的每个实例都包含或拥有另一个模型的一个实例。 例如,您的应用包含 user 和 credit card 模型,且每个 user 只能有一张 credit card。 声明1234567891011// User 有一张 CreditCard,UserID 是外键type User stru 2024-12-04 Go #Go
23-has_many Has Manyhas many 与另一个模型建立了一对多的连接。 不同于 has one,拥有者可以有零或多个关联模型。 例如,您的应用包含 user 和 credit card 模型,且每个 user 可以有多张 credit card。 声明1234567891011// User 有多张 CreditCard,UserID 是外键type User struct { gorm. 2024-12-04 Go #Go
24-many_to_many Many To ManyMany to Many 会在两个 model 中添加一张连接表。 例如,您的应用包含了 user 和 language,且一个 user 可以说多种 language,多个 user 也可以说一种 language。 12345678910// User 拥有并属于多种 language,`user_languages` 是连接表type User struct 2024-12-04 Go #Go
25-polymorphism Polymorphism AssociationGORM supports polymorphism association for has one and has many, it will save owned entity’s table name into polymorphic type’s field, primary key value into the polymorphic fi 2024-12-04 Go #Go
26-关联模式 自动创建、更新GORM在创建或更新记录时会自动地保存其关联和引用,主要使用upsert技术来更新现有关联的外键引用。 在创建时自动保存关联当你创建一条新的记录时,GORM会自动保存它的关联数据。 这个过程包括向关联表插入数据以及维护外键引用。 12345678910111213141516171819202122232425user := User{ Name: 2024-12-04 Go #Go
27-预加载 预加载示例GORM允许使用 Preload通过多个SQL中来直接加载关系, 例如: 12345678910111213141516171819202122type User struct { gorm.Model Username string Orders []Order}type Order struct { gorm.Model UserID ui 2024-12-04 Go #Go
changelog v2.0 - 2020.08GORM 2.0 是基于用户过去几年中的反馈进行思考后的重写,在该发行版本中将会引入不兼容 API 改动。 性能优化 代码模块化 Context,批量插入,预编译模式,DryRun 模式,Join 预加载,Find To Map,Create From Map,FindInBatches 支持 SavePoint/RollbackTo/Nested 2024-12-04 Go #Go
composite_primary_key 通过将多个字段设为主键,以创建复合主键,例如: 123456type Product struct { ID string `gorm:"primaryKey"` LanguageCode string `gorm:"primaryKey"` Code string Name string} 注意:默认情况下,整型 2024-12-04 Go #Go
constraints GORM 允许通过标签创建数据库约束,约束会在通过 GORM 进行 AutoMigrate 或创建数据表时被创建。 检查约束通过 check 标签创建检查约束 12345type UserIndex struct { Name string `gorm:"check:name_checker,name <> 'jinzhu'"` Name2 string `go 2024-12-04 Go #Go
context GORM 的上下文支持由 WithContext 方法启用,是一项强大的功能,可以增强 Go 应用程序中数据库操作的灵活性和控制力。 它允许在不同的操作模式、超时设置以及甚至集成到钩子/回调和中间件中进行上下文管理。 让我们从不同方面深入了解: 单会话模式Single session mode is appropriate for executing individual operati 2024-12-04 Go #Go
data_types GORM 提供了少量接口,使用户能够为 GORM 定义支持的数据类型,这里以 json 为例 实现自定义数据类型Scanner / Valuer自定义的数据类型必须实现 Scanner 和 Valuer 接口,以便让 GORM 知道如何将该类型接收、保存到数据库 例如: 12345678910111213141516171819202122type JSON json.RawMessag 2024-12-04 Go #Go
dbresolver DBResolver 为 GORM 提供了多个数据库支持,支持以下功能: 支持多个 sources、replicas 读写分离 根据工作表、struct 自动切换连接 手动切换连接 Sources/Replicas 负载均衡 适用于原生 SQL 事务 https://github.com/go-gorm/dbresolver 用法123456789101112131415161718 2024-12-04 Go #Go
error_handling 在Go语言的应用开发中,特别是在使用GORM与数据库交互时,有效的错误处理是构建稳健应用的基石。 GORM对错误处理的方法,受到其可链式API的影响,需要细致地理解。 基本错误处理GORM将错误处理集成到其可链式方法语法中。 *gorm.DB实例包含一个Error字段,当发生错误时会被设置。 通常的做法是在执行数据库操作后,特别是在完成方法(Finisher Methods)后,检查这个字段。 在 2024-12-04 Go #Go
generic_interface GORM 提供了 DB 方法,可用于从当前 *gorm.DB 返回一个通用的数据库接口 *sql.DB 1234567891011// 获取通用数据库对象 sql.DB,然后使用其提供的功能sqlDB, err := db.DB()// PingsqlDB.Ping()// ClosesqlDB.Close()// 返回数据库统计信息sqlDB.Stats() 注意 如果底层连接的数据库不是 * 2024-12-04 Go #Go
gorm_config GORM 提供的配置可以在初始化时使用 123456789101112type Config struct { SkipDefaultTransaction bool NamingStrategy schema.Namer Logger logger.Interface NowFunc 2024-12-04 Go #Go