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
conventions 使用 ID 作为主键默认情况下,GORM 会使用 ID 作为表的主键。 1234type User struct { ID string // 默认情况下,名为 `ID` 的字段会作为表的主键 Name string} 你可以通过标签 primaryKey 将其它字段设为主键 1234567// 将 `UUID` 设为主键type Animal struct 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
hints GORM 提供了 optimizer/index/comment hint 支持 https://github.com/go-gorm/hints Optimizer Hints1234import "gorm.io/hints"db.Clauses(hints.New("hint")).Find(&User{})// SELECT * /*+ hi 2024-12-04 Go #Go
hooks 对象生命周期Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数。 如果您已经为模型定义了指定的方法,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。 钩子方法的函数签名应该是 func(*gorm.DB) error Hook创建对象创建时可用的 hook 123456789// 开始事务BeforeSaveBeforeCreate 2024-12-04 Go #Go
indexes GORM 允许通过 index、uniqueIndex 标签创建索引,这些索引将在使用 GORM 进行AutoMigrate 或 Createtable 时创建 索引标签GORM 可以接受很多索引设置,例如class、type、where、comment、expression、sort、collate、option 下面的示例演示了如何使用它: 1234567891011121314151617 2024-12-04 Go #Go
logger 日志Gorm 有一个 默认 logger 实现,默认情况下,它会打印慢 SQL 和错误 Logger 接受的选项不多,您可以在初始化时自定义它,例如: 1234567891011121314151617181920newLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer logger.Con 2024-12-04 Go #Go
method_chaining GORM 的方法链功能可实现平滑流畅的编码风格。 Here’s an example: 1db.Where("name = ?", "jinzhu").Where("age = ?", 18).First(&user) Method CategoriesGORM 将方法分为三大类: Chain Methods, Finisher Methods, and New Session Meth 2024-12-04 Go #Go