Gorm框架
1|0Go的orm框架
1|11. gorm
-
老牌国产Golang orm框架。支持主流关系型数据库。中文文档适合新人入手,国内使用较多。最新版本2.x,比1.x有较大改动
-
注意:Gorm最新地址为https://github.com/go-gorm/gorm,之前https://github.com/jinzhu/gorm地址为v1旧版本
-
Gorm最新源码地址:https://github.com/go-gorm/gorm
-
中文文档地址:https://gorm.io/zh_CN/
-
star数量:28k
1|22. facebook-ent
-
facebook开源的,ent是一个简单而又功能强大的Go语言实体框架,ent易于构建和维护应用程序与大数据模型
-
文档地址:https://entgo.io/
-
star数量:10.7k
1|33. xorm
-
老牌的Go语言 orm框架。支持主流关系型数据库 支持如下驱动 - Mysql - MyMysql - Postgres - Tidb - SQLite - MsSql - Oracle
-
中文文档地址:https://gitea.com/xorm/xorm/src/branch/master/README_CN.md
-
star数量:6.5k
1|44. upper/db:
-
支持PostgreSQL、CockroachDB、MySQL、SQLite和MongoDB的数据访问层,具有类似ORM的功能
-
亮点是支持
-
nosql
-
PostgreSQL
-
MySQL
-
MSSQL
-
CockroachDB
-
MongoDB
-
QL
-
SQLite
-
-
star数量:3k
1|55. gorose
-
国产轻量级 orm框架,支持如下驱动 - mysql - sqlite3 - postgres - oracle - mssql - clickhouse
-
star数量:1.1k
2|0一、Gorm介绍
-
Gorm 是 Golang 的一个 orm 框架。ORM 是通过实例对象的语法,完成关系型 数据库的操作,是"对象-关系映射"(Object/Relational Mapping) 的缩写。使用 ORM 框架可以让我们更方便的操作数据库。
-
Gorm官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
-
作者是中国人,中文文档齐全,对开发者友好,支持主流数据库。
-
全功能 ORM
-
关联 (拥有一个,拥有多个,属于,多对多,多态,单表继承)
-
Create,Save,Update,Delete,Find 中钩子方法
-
支持 Preload、Joins 的预加载
-
事务,嵌套事务,Save Point,Rollback To to Saved Point
-
Context、预编译模式、DryRun 模式
-
批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
-
SQL 构建器,Upsert,锁,Optimizer/Index/Comment Hint,命名参数,子查询
-
复合主键,索引,约束
-
自动迁移
-
自定义 Logger
-
灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
-
每个特性都经过了测试的重重考验
-
开发者友好
3|0二、gorm连接数据库
3|12.1 快速链接mysql
3|22.2 其他配置
注意:想要正确的处理
time.Time
,您需要带上parseTime
参数, (更多参数) 要支持完整的 UTF-8 编码,您需要将charset=utf8
更改为charset=utf8mb4
查看 此文章 获取详情
- MySQl 驱动程序提供了 一些高级配置 可以在初始化过程中使用,例如:
3|32.3 加入日志打印sql
-
Gorm 有一个 默认 logger 实现,默认情况下,它会打印慢 SQL 和错误
-
Logger 接受的选项不多,您可以在初始化时自定义它,例如:
(1)日志级别
- GORM 定义了这些日志级别:
Silent
、Error
、Warn
、Info
(2)Debug
- Debug 单个操作,将当前操作的 log 级别调整为 logger.Info
(3)具体代码
4|0三、automigrate功能
AutoMigrate自动创建表,可以打开Navicat查看表结构
gorm.Model结构体嵌套
5|0四、快速增删改查
5|14.1 快速增删改查
5|24.2 逻辑删除
6|0五、不能更新零值的问题
6|15.1 使用sql.NullString更新
6|25.2 使用指针解决
7|0六、表结构定义细节
7|16.1 模型定义
7|26.2 约定
-
GORM 倾向于约定,而不是配置。默认情况下,GORM 使用
ID
作为主键,使用结构体名的蛇形复数
作为表名,字段名的蛇形
作为列名,并使用CreatedAt
、UpdatedAt
字段追踪创建、更新时间 -
遵循 GORM 已有的约定,可以减少您的配置和代码量。如果约定不符合您的需求,GORM 允许您自定义配置它们
7|36.3 gorm.Model
- GORM 定义一个
gorm.Model
结构体,其包括字段ID
、CreatedAt
、UpdatedAt
、DeletedAt
- 您可以将它嵌入到您的结构体中,以包含这几个字段,详情请参考 嵌入结构体
7|46.4 高级选项
(1)字段级权限控制
- 可导出的字段在使用 GORM 进行 CRUD 时拥有全部的权限,此外,GORM 允许您用标签控制字段级别的权限。这样您就可以让一个字段的权限是只读、只写、只创建、只更新或者被忽略
注意: 使用 GORM Migrator 创建表时,不会创建被忽略的字段
(2)创建/更新时间追踪(纳秒、毫秒、秒、Time)
-
GORM 约定使用
CreatedAt
、UpdatedAt
追踪创建/更新时间。如果您定义了这种字段,GORM 在创建、更新时会自动填充 当前时间 -
要使用不同名称的字段,您可以配置
autoCreateTime
、autoUpdateTime
标签 -
如果您想要保存 UNIX(毫/纳)秒时间戳,而不是 time,您只需简单地将
time.Time
修改为int
即可
(3)嵌入结构体
- 对于匿名字段,GORM 会将其字段包含在父结构体中,例如:
- 对于正常的结构体字段,你也可以通过标签
embedded
将其嵌入,例如:
- 并且,您可以使用标签
embeddedPrefix
来为 db 中的字段名添加前缀,例如:
(4)字段标签
- 声明 model 时,tag 是可选的,GORM 支持以下 tag: tag 名大小写不敏感,但建议使用
camelCase
风格
标签名 | 说明 |
---|---|
column | 指定 db 列名 |
type | 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null 、size , autoIncrement … 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT |
serializer | 指定如何将数据序列化和反序列化到数据库中的序列化程序,如: serializer:json/gob/unixtime |
size | 指定列数据大小/长度, 如: size:256 |
primaryKey | 指定列作为主键 |
unique | 指定列作为unique |
default | 指定列的默认值 |
precision | 指定列的精度 |
scale | 指定列的比例 |
not null | 指定列不为空 |
autoIncrement | 指定列自增 |
autoIncrementIncrement | 自动递增步长,控制连续列值之间的间隔 |
embedded | 嵌入字段 |
embeddedPrefix | 嵌入嵌入字段的字段列名前缀 |
autoCreateTime | 跟踪当前时间创建时,对于'int'字段,它将跟踪unix秒,使用值'nano/'milli 跟踪unix nano/milli秒,如: autoCreateTime:nano |
autoUpdateTime | 在创建/更新时跟踪当前时间,对于'int'字段,它将跟踪unix秒,使用值'nano/'milli 跟踪unix nano/milli秒, 如: autoUpdateTime:milli |
index | 使用选项创建索引,对多个字段使用相同的名称创建复合索引, 详情参照 Indexes |
uniqueIndex | 与'index'相同,但创建唯一索引 |
check | 创建检查约束, 如: check:age > 13 , 参照 Constraints |
<- | 设置字段的写入权限, <-:create 仅创建字段, <-:update 仅更新字段, <-:false 没有写权限, <- 创建和更新权限 |
-> | 设置字段读权限, ->:false 没有读权限 |
- | 忽略该字段, - 没有读写权限, -:migration 没有迁移权限, -:all 没有 read/write/migrate 权限 |
comment | 迁移时为字段添加注释 |
7|56.5 案例
8|0七、Gorm增加操作
- 我们尽量按照官方文档来看,网上教程都是老版本居多
[](http://photo.liuqingzheng.top/20220515-image-20220515000442200 .png)
8|17.1 创建记录
8|27.2 用指定的字段创建记录
- 创建记录并更新给出的字段。
- 创建一个记录且一同忽略传递给略去的字段值。
8|37.3 批量插入
- 要有效地插入大量记录,请将一个
slice
传递给Create
方法。 GORM 将生成单独一条SQL语句来插入所有数据,并回填主键的值,钩子方法也会被调用。
- 使用
CreateInBatches
分批创建时,你可以指定每批的数量,例如:
- Upsert 和 Create With Associations 也支持批量插入
注意 使用
CreateBatchSize
选项初始化 GORM 时,所有的创建& 关联INSERT
都将遵循该选项
8|47.4 创建钩子
- GORM 允许用户定义的钩子有
BeforeSave
,BeforeCreate
,AfterSave
,AfterCreate
创建记录时将调用这些钩子方法,请参考 Hooks 中关于生命周期的详细信息
- 如果您想跳过
钩子
方法,您可以使用SkipHooks
会话模式,例如:
8|57.5 根据 Map 创建
- GORM 支持根据
map[string]interface{}
和[]map[string]interface{}{}
创建记录,例如:
注意: 根据 map 创建记录时,association 不会被调用,且主键也不会自动填充
8|67.6 使用 SQL 表达式、Context Valuer 创建记录(了解)
- GORM 允许使用 SQL 表达式插入数据,有两种方法实现这个目标。根据
map[string]interface{}
或 自定义数据类型 创建,例如:
8|77.7 高级选项
(1)关联创建(详见后面关联关系)
- 创建关联数据时,如果关联值是非零值,这些关联会被 upsert,且它们的
Hook
方法也会被调用
- 您也可以通过
Select
、Omit
跳过关联保存,例如:
(2)默认值
- 您可以通过标签
default
为字段定义默认值,如:
- 插入记录到数据库时,默认值 会被用于 填充值为 零值 的字段
注意 对于声明了默认值的字段,像
0
、''
、false
等零值是不会保存到数据库。您需要使用指针类型或 Scanner/Valuer 来避免这个问题,例如:
注意 若要数据库有默认、虚拟/生成的值,你必须为字段设置
default
标签。若要在迁移时跳过默认值定义,你可以使用default:(-)
,例如:
- 使用虚拟/生成的值时,你可能需要禁用它的创建、更新权限,查看 字段级权限 获取详情
(3)Upsert 及冲突(了解)
-
GORM 为不同数据库提供了兼容的 Upsert 支持
-
有时候插入数据,报主键冲突,有upsert 既可以更新数据,又可以插入数据,来解决这个问题,如果主键存在就更新
-
您还可以查看 高级查询 中的
FirstOrInit
、FirstOrCreate
-
查看 原生 SQL 及构造器 获取更多细节
9|0八、Gorm查询
9|18.1 检索单个对象
- GORM 提供了
First
、Take
、Last
方法,以便从数据库中检索单个对象。当查询数据库时它添加了LIMIT 1
条件,且没有找到记录时,它会返回ErrRecordNotFound
错误
如果你想避免
ErrRecordNotFound
错误,你可以使用Find
,比如db.Limit(1).Find(&user)
,Find
方法可以接受struct和slice的数据。
First
和Last
会根据主键排序,分别查询第一条和最后一条记录。 只有在目标 struct 是指针或者通过db.Model()
指定 model 时,该方法才有效。 此外,如果相关 model 没有定义主键,那么将按 model 的第一个字段进行排序。 例如:
(1)用主键检索
- 如果主键是字符串(例如像 uuid),查询将被写成这样:
- When the destination object has a primary value, the primary key will be used to build the condition, for example:
9|28.2 检索全部对象
9|38.3 条件
(1)String 条件
(2)Struct & Map 条件
NOTE When querying with struct, GORM will only query with non-zero fields, that means if your field’s value is
0
,''
,false
or other zero values, it won’t be used to build query conditions, for example:
- To include zero values in the query conditions, you can use a map, which will include all key-values as query conditions, for example:
- For more details, see Specify Struct search fields.
(3)指定结构体查询字段
- When searching with struct, you can specify which particular values from the struct to use in the query conditions by passing in the relevant field name or the dbname to
Where()
, for example:
(4)内联条件
- 查询条件可以以类似于Where的方式内联到'First'和'Find'等方法中
(5)Not 条件
-
Build NOT conditions, works similar to
Where
-
构建NOT条件,工作原理同Where
(6)Or 条件
- For more complicated SQL queries. please also refer to Group Conditions in Advanced Query.
9|48.4 选择特定字段
Select
允许您指定要从数据库检索的字段。否则,GORM将默认选择所有字段
- Also check out Smart Select Fields
9|58.5 Order
-
Specify order when retrieving records from the database
-
指定从数据库检索记录时的顺序
9|68.6 Limit & Offset
-
Limit
specify the max number of records to retrieveOffset
specify the number of records to skip before starting to return the records -
Limit
指定要检索的最大记录数Offset
指定开始返回记录之前要跳过的记录数
- Refer to Pagination for details on how to make a paginator
9|78.7 Group By & Having
9|88.8 Distinct
-
Selecting distinct values from the model
-
从模型中选择不同的值
9|98.9 Joins
- Specify Joins conditions-指定连接条件
(1)Joins 预加载
-
You can use
Joins
eager loading associations with a single SQL, for example: -
可以使用'Joins'来加载与单个SQL的关联
- Join with conditions
- For more details, please refer to Preloading (Eager Loading).
(2)Joins a Derived Table
- You can also use
Joins
to join a derived table.
9|108.10 Scan
-
Scanning results into a struct works similarly to the way we use
Find
-- -
将结果扫描到结构体中的工作方式,与“Find”类似
10|0九、高级查询(了解)
10|19.1 智能选择字段
- GORM 允许通过
Select
方法选择特定的字段,如果您在应用程序中经常使用此功能,你也可以定义一个较小的结构体,以实现调用 API 时自动选择特定的字段,例如:
注意
QueryFields
模式会根据当前 model 的所有字段名称进行 select。
10|29.2 Locking (FOR UPDATE)
- GORM 支持多种类型的锁,例如:
- 查看 原生 SQL 及构造器 获取详情
10|39.3 子查询
- 子查询可以嵌套在查询中,GORM 允许在使用
*gorm.DB
对象作为参数时生成子查询
(1)From 子查询
- GORM 允许您在
Table
方法中通过 FROM 子句使用子查询,例如:
10|49.4 Group 条件
- 使用 Group 条件可以更轻松的编写复杂 SQL
10|59.5 带多个列的 In
- 带多个列的 In 查询
10|69.6 命名参数
- GORM 支持
sql.NamedArg
和map[string]interface{}{}
形式的命名参数,例如:
- 查看 原生 SQL 及构造器 获取详情
10|79.7 Find 至 map
- GORM 允许扫描结果至
map[string]interface{}
或[]map[string]interface{}
,此时别忘了指定Model
或Table
,例如:
10|89.8 FirstOrInit
- 获取第一条匹配的记录,或者根据给定的条件初始化一个实例(仅支持 sturct 和 map 条件)
- 如果没有找到记录,可以使用包含更多的属性的结构体初始化 user,
Attrs
不会被用于生成查询 SQL
- 不管是否找到记录,
Assign
都会将属性赋值给 struct,但这些属性不会被用于生成查询 SQL,也不会被保存到数据库
10|99.9 FirstOrCreate
- Get first matched record or create a new one with given conditions (only works with struct, map conditions),
RowsAffected
returns created/updated record’s count
- 如果没有找到记录,可以使用包含更多的属性的结构体创建记录,
Attrs
不会被用于生成查询 SQL 。
- 不管是否找到记录,
Assign
都会将属性赋值给 struct,并将结果写回数据库
10|109.10 优化器、索引提示
- 优化器提示用于控制查询优化器选择某个查询执行计划,GORM 通过
gorm.io/hints
提供支持,例如:
- 索引提示允许传递索引提示到数据库,以防查询计划器出现混乱。
- 参考 优化器提示、索引、备注 获取详情
10|119.11 迭代
- GORM 支持通过行进行迭代
10|129.12 FindInBatches
- 用于批量查询并处理记录
10|139.13 查询钩子
- 对于查询操作,GORM 支持
AfterFind
钩子,查询记录后会调用它,详情请参考 钩子
10|149.14 Pluck
- Pluck 用于从数据库查询单个列,并将结果扫描到切片。如果您想要查询多列,您应该使用
Select
和Scan
10|159.15 Scope
Scopes
允许你指定常用的查询,可以在调用方法时引用这些查询
- 查看 Scopes 获取详情
10|169.16 Count
- Count 用于获取匹配的记录数
11|0十、更新
11|110.1 保存所有字段
Save
会保存所有的字段,即使字段是零值
11|210.2 更新单个列
- 当使用
Update
更新单个列时,你需要指定条件,否则会返回ErrMissingWhereClause
错误,查看 Block Global Updates 获取详情。当使用了Model
方法,且该对象主键有值,该值会被用于构建条件,例如:
11|310.3 更新多列
Updates
方法支持struct
和map[string]interface{}
参数。当使用struct
更新时,默认情况下,GORM 只会更新非零值的字段
注意 当通过 struct 更新时,GORM 只会更新非零字段。 如果您想确保指定字段被更新,你应该使用
Select
更新选定字段,或使用map
来完成更新操作
11|410.4 更新选定字段
- 如果您想要在更新时选定、忽略某些字段,您可以使用
Select
、Omit
11|510.5 更新 Hook
- 对于更新操作,GORM 支持
BeforeSave
、BeforeUpdate
、AfterSave
、AfterUpdate
钩子,这些方法将在更新记录时被调用,详情请参阅 钩子
11|610.6 批量更新
- 如果您尚未通过
Model
指定记录的主键,则 GORM 会执行批量更新
(1)阻止全局更新
-
如果在没有任何条件的情况下执行批量更新,默认情况下,GORM 不会执行该操作,并返回
ErrMissingWhereClause
错误 -
对此,你必须加一些条件,或者使用原生 SQL,或者启用
AllowGlobalUpdate
模式,例如:
(2)更新的记录数
- 获取受更新影响的行数
11|710.7 高级选项(了解)
(1)使用 SQL 表达式更新
- GORM 允许使用 SQL 表达式更新列,例如:
- 并且 GORM 也允许使用 SQL 表达式、自定义数据类型的 Context Valuer 来更新,例如:
(2)根据子查询进行更新
- 使用子查询更新表
(3)不使用 Hook 和时间追踪
- 如果您想在更新时跳过
Hook
方法且不追踪更新时间,可以使用UpdateColumn
、UpdateColumns
,其用法类似于Update
、Updates
(4)返回修改行的数据(了解->mysql不支持)
- 返回被修改的数据,仅适用于支持 Returning 的数据库,例如:
(5)检查字段是否有变更?
-
GORM 提供了
Changed
方法,它可以被用在 Before Update Hook 里,它会返回字段是否有变更的布尔值 -
Changed
方法只能与Update
、Updates
方法一起使用,并且它只是检查 Model 对象字段的值与Update
、Updates
的值是否相等,如果值有变更,且字段没有被忽略,则返回 true
(6)在 Update 时修改值
- 若要在 Before 钩子中改变要更新的值,如果它是一个完整的更新,可以使用
Save
;否则,应该使用SetColumn
,例如:
12|0十一、删除
12|111.1 删除一条记录
- 删除一条记录时,删除对象需要指定主键,否则会触发 批量 Delete,例如:
12|211.2 根据主键删除
- GORM 允许通过主键(可以是复合主键)和内联条件来删除对象,它可以使用数字(如以下例子。也可以使用字符串——译者注)。查看 查询-内联条件(Query Inline Conditions) 了解详情。
12|311.3 Delete Hook
- 对于删除操作,GORM 支持
BeforeDelete
、AfterDelete
Hook,在删除记录时会调用这些方法,查看 Hook 获取详情
12|411.4 批量删除
- 如果指定的值不包括主属性,那么 GORM 会执行批量删除,它将删除所有匹配的记录
(1)阻止全局删除
-
如果在没有任何条件的情况下执行批量删除,GORM 不会执行该操作,并返回
ErrMissingWhereClause
错误 -
对此,你必须加一些条件,或者使用原生 SQL,或者启用
AllowGlobalUpdate
模式,例如:
(2)返回删除行的数据(了解)
- 返回被删除的数据,仅适用于支持 Returning 的数据库,例如:
12|511.5 软删除
-
如果您的模型包含了一个
gorm.deletedat
字段(gorm.Model
已经包含了该字段),它将自动获得软删除的能力! -
拥有软删除能力的模型调用
Delete
时,记录不会被数据库。但 GORM 会将DeletedAt
置为当前时间, 并且你不能再通过普通的查询方法找到该记录。
- 如果您不想引入
gorm.Model
,您也可以这样启用软删除特性:
(1)查找被软删除的记录
- 您可以使用
Unscoped
找到被软删除的记录
(2)永久删除
- 您也可以使用
Unscoped
永久删除匹配的记录
(3)Delete Flag
- 将 unix 时间戳作为 delete flag
INFO 在配合 unique 字段使用软删除时,您需要使用这个基于 unix 时间戳的
DeletedAt
字段创建一个复合索引,例如:
- 使用
1
/0
作为 delete flag
13|0十二、SQL 构建器
13|112.1 原生 SQL
- 原生查询 SQL 和
Scan
Exec
原生 SQL
注意 GORM 允许缓存预编译 SQL 语句来提高性能,查看 性能 获取详情
13|212.2 命名参数
- GORM 支持
sql.NamedArg
、map[string]interface{}{}
或 struct 形式的命名参数,例如:
13|312.3 DryRun 模式
- 在不执行的情况下生成
SQL
及其参数,可以用于准备或测试生成的 SQL,详情请参考 Session
13|412.4 ToSQL
-
返回生成的
SQL
但不执行。 -
GORM使用 database/sql 的参数占位符来构建 SQL 语句,它会自动转义参数以避免 SQL 注入,但我们不保证生成 SQL 的安全,请只用于调试。
13|512.5 Row & Rows
- 获取
*sql.Row
结果
- 获取
*sql.Rows
结果
- 转到 FindInBatches 获取如何在批量中查询和处理记录的信息, 转到 Group 条件 获取如何构建复杂 SQL 查询的信息
13|612.6 将 sql.Rows 扫描至 model
- 使用
ScanRows
将一行记录扫描至 struct,例如:
13|712.7 Connection
- Run mutliple SQL in same db tcp connection (not in a transaction)
13|812.8 Advanced(了解)
(1)子句(Clause)
-
GORM uses SQL builder generates SQL internally, for each operation, GORM creates a
*gorm.Statement
object, all GORM APIs add/changeClause
for theStatement
, at last, GORM generated SQL based on those clauses -
For example, when querying with
First
, it adds the following clauses to theStatement
- Then GORM build finally querying SQL in the
Query
callbacks like:
- Which generate SQL:
-
You can define your own
Clause
and use it with GORM, it needs to implements Interface -
Check out examples for reference
(2)子句构造器
- For different databases, Clauses may generate different SQL, for example:
- Which is supported because GORM allows database driver register Clause Builder to replace the default one, take the Limit as example
(3)子句选项
-
GORM defined Many Clauses, and some clauses provide advanced options can be used for your application
-
Although most of them are rarely used, if you find GORM public API can’t match your requirements, may be good to check them out, for example:
(4)StatementModifier
- GORM provides interface StatementModifier allows you modify statement to match your requirements, take Hints as example
14|0十三、关联之Belongs To
14|113.1 Belongs To
-
belongs to
会与另一个模型建立了一对一的连接。 这种模型的每一个实例都“属于”另一个模型的一个实例。 -
例如,您的应用包含 user 和 company,并且每个 user 能且只能被分配给一个 company。下面的类型就表示这种关系。 注意,在
User
对象中,有一个和Company
一样的CompanyID
。 默认情况下,CompanyID
被隐含地用来在User
和Company
之间创建一个外键关系, 因此必须包含在User
结构体中才能填充Company
内部结构体。
- 请参阅 预加载 以了解内部结构的详细信息。
14|213.2 重写外键
-
要定义一个 belongs to 关系,数据库的表中必须存在外键。默认情况下,外键的名字,使用拥有者的类型名称加上表的主键的字段名字
-
例如,定义一个User实体属于Company实体,那么外键的名字一般使用CompanyID。
-
GORM同时提供自定义外键名字的方式,如下例所示。
14|313.3 重写引用(一般不用)
-
对于 belongs to 关系,GORM 通常使用数据库表,主表(拥有者)的主键值作为外键参考。 正如上面的例子,我们使用主表Company中的主键字段ID作为外键的参考值。
-
如果在Company实体中设置了User实体,那么GORM会自动把Company中的ID属性保存到User的CompanyID属性中。
-
同样的,您也可以使用标签
references
来更改它,例如:
14|413.4 Belongs to 的 CRUD
- 点击 关联模式 链接获取 belongs to 相关的用法
14|513.5 预加载
- GORM允许通过使用
Preload
或者Joins
来主动加载实体的关联关系,具体内容请参考,预加载(主动加载)
14|613.6 外键约束
- 你可以通过
OnUpdate
,OnDelete
配置标签来增加关联关系的级联操作,如下面的例子,通过GORM可以完成用户和公司的级联更新和级联删除操作:
14|713.7 案例
15|0十四、通过preload和joins查询多表
16|0十五、has many关系
17|0十六、多对多的关系
18|0十七、gorm其它操作
18|117.1 自定义表名
(1)完全自定义表名
(2)给所有表名增加前缀
18|217.2 自定义事件字段
__EOF__

本文链接:https://www.cnblogs.com/Mcoming/p/18074912.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律