GORM MYSQL
Go Web 编程
GORM
ORM(Object Relation Mapping), 对象关系映射, 实际上就是对数据库的操作进行封装, 对上层开发人员屏蔽数据操作的细节, 开发人员看到的就是一个个对象, 大大简化了开发工作, 提高了生产效率
O = Object 对象 (程序中的对象/实例 如: Struct 结构体)
R = Relational 关系 (关系型数据库 如: Mysql)
M = Mapping 映射
- 结构体 –> 数据表
- 结构体实例 –> 数据库行
- 结构体字段 –> 数据库字段
ORM 优缺点
优点 - 提高开发效率, 不需要使用SQL语句。
缺点 - 执行性能较差、灵活性较差、弱化了SQL能力。
GORM 概览
全功能 ORM (无限接近)
关联 (Has One, Has Many, Belongs To, Many To Many, 多态)
钩子 (在创建/保存/更新/删除/查找之前或之后)
预加载
事务
复合主键
SQL 生成器
数据库自动迁移
自定义日志
可扩展性, 可基于 GORM 回调编写插件
所有功能都被测试覆盖
开发者友好
gorm 模块用法
|
|
- gorm to mysql
|
|
GORM Model
在使用ORM工具时,通常我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,在GORM中模型(Models)通常是正常定义的结构体、基本的go类型或它们的指针。 同时也支持
sql.Scanner
及driver.Valuer
、接口interfaces
。GORM 内置了一个
gorm.Model
结构体。gorm.Model
是一个包含了ID
、CreatedAt
、UpdatedAt
、DeletedAt
四个字段的Golang结构体。
|
|
- 嵌入到自己的结构体模型中
|
|
- GORM 结构体标识 (struct tag)
结构体标识(Tga) | 描述 |
---|---|
Column | 指定列名 |
Type | 指定列数据类型 |
Size | 指定列大小, 默认值255 |
PRIMARY_KEY | 将列指定为主键 |
UNIQUE | 将列指定为唯一 |
DEFAULT | 指定列默认值 |
PRECISION | 指定列精度 |
NOT NULL | 将列指定为非 NULL |
AUTO_INCREMENT | 指定列是否为自增类型 |
INDEX | 创建具有或不带名称的索引, 如果多个索引同名则创建复合索引 |
UNIQUE_INDEX | 和 INDEX 类似,只不过创建的是唯一索引 |
EMBEDDED | 将结构设置为嵌入 |
EMBEDDED_PREFIX | 设置嵌入结构的前缀 |
- | 忽略此字段 |
- GORM 创建表时 set 的标识
创建表的标识 | 描述 |
---|---|
MANY2MANY | 指定连接表 |
FOREIGNKEY | 设置外键 |
ASSOCIATION_FOREIGNKEY | 设置关联外键 |
POLYMORPHIC | 指定多态类型 |
POLYMORPHIC_VALUE | 指定多态值 |
JOINTABLE_FOREIGNKEY | 指定连接表的外键 |
ASSOCIATION_JOINTABLE_FOREIGNKEY | 指定连接表的关联外键 |
SAVE_ASSOCIATIONS | 是否自动完成 save 的相关操作 |
ASSOCIATION_AUTOUPDATE | 是否自动完成 update 的相关操作 |
ASSOCIATION_AUTOCREATE | 是否自动完成 create 的相关操作 |
ASSOCIATION_SAVE_REFERENCE | 是否自动完成引用的 save 的相关操作 |
PRELOAD | 是否自动完成预加载的相关操作 |
主键、表名、列名的约定
主键 (Primary Key) , GORM 默认会使用名为
ID
这个字段名作为表的主键。修改默认的 主键名为 其他, 需要使用结构体 tag
grom:"primary_key"
来约定。
|
|
表名 (Table Name)
GROM 创建数据表, 表名默认就是结构体名称的复数, 如:
User = users
,UserInfo = user_infos
修改默认的 数据表名称。
|
|
|
|
|
|
数据列 名称 (Column Name)
列名 是由 结构体字段的名称组合,一个字段多个单词组成 会使用
_
分割开。如:MemberNumber
=member_number
修改默认的 数据列名称, 可使用结构体
tag
中的column
指定列名。
|
|
时间类型 (At)
CreatedAt
字段, 该字段的值将会是初次创建记录的时间。UpdatedAt
字段,该字段的值将会是每次更新记录的时间。DeletedAt
字段,调用Delete方法删除该记录时,将会设置DeletedAt
字段为当前时间,而不是直接将记录从数据库中删除。
GORM CRUD
- CRUD 增、删、改、查
增
- 增加(create)
|
|
注意: 使用 结构体 tag default 设置默认值的时候, 所有字段的零值, 比如
0
,""
,false
或者其它零值,都不会保存到数据库内,但会使用他们的默认值。如需要零值/空值, 可以使用:Name *string
gorm:“default:‘小炒肉’“``
|
|
Name sql.NullString
gorm:“default:‘小炒肉’“``
|
|
查询
- 查询 (First、Take、Last、Find)
|
|
- 条件选取 (Where)
|
|
提示:当通过结构体进行查询时,GORM将会只通过非零值字段查询,这意味着如果你的字段值为
0
,''
,false
或者其他零值时,将不会被用于构建查询条件。条件排除 (Not)
|
|
- OR (或)
|
|
- 内联操作
|
|
FirstOrInit
- 获取匹配的第一条记录,否则根据给定的条件初始化一个新的对象 (仅支持
struct
和map
条件)
- 获取匹配的第一条记录,否则根据给定的条件初始化一个新的对象 (仅支持
|
|
Attrs 与 Assign
Attrs 如果记录未找到, 将使用参数初始化
struct
。Assign 不管记录是否找到,都将参数赋值给
struct
。
|
|
FirstOrCreate
- 获取匹配的第一条记录, 否则根据给定的条件创建一个新的数据库记录 (仅支持
struct
和map
条件)
- 获取匹配的第一条记录, 否则根据给定的条件创建一个新的数据库记录 (仅支持
|
|
高级查询
- 子查询 (QueryExpr)
|
|
- 选择字段 (Select)
|
|
排序 (Order)
- 定从数据库中检索出记录的顺序。设置第二个参数
reorder
为true
,可以覆盖前面定义的排序条件。
- 定从数据库中检索出记录的顺序。设置第二个参数
|
|
数量 (Limit)
- 指定从数据库检索出的最大记录数。
|
|
偏移 (Offset)
- 指定开始返回记录前要跳过的记录数。
|
|
总数 (Count)
获取记录的总数。
Count
必须是链式查询的最后一个操作 ,因为它会覆盖前面的SELECT
,但如果里面使用了count
时不会覆盖。
|
|
扫描 (Scan)
- 扫描结果记录到一个
Struct
实例中。
- 扫描结果记录到一个
|
|
立即执行方法 (Immediate Methods)
立即执行方法是指那些会立即执行
SQL
语句并发送到数据库的方法, 如:Create
、First
、Find
、Take
、Save
、Update
、Delete
、Scan
、Row
等.多个立即执行方法,后一个立即执行方法会复用前面那个立刻执行方法的条件( 不包含内联条件 )。
|
|
范围 (Scopes)
Scope 是建立在链式操作基础上的方法。
可以让代码更加通用,逻辑更清晰。
|
|
更新
- 更新所有字段 ( Save )
|
|
- 更新指定字段 ( Update 、Updates )
|
|
更新选定或忽略的字段
选定 (Select)
忽略 (Omit)
|
|
- 不触发Hook更新
|
|
批量更新
- 批量更新字段的时候
Hook
也不会执行。
- 批量更新字段的时候
|
|
利用 SQL 表达式计算和更新数据
gorm.Expr
|
|
删除
GORM 删除记录时, 请必须指定主键的值, GORM是根据指定主键删除记录的, 如果没有指定主键的值, 那么GORM会删除Model指定的所有的数据。
GORM 删除记录 都是进行软删除, 既将
deleted_at
更新为删除的时间, 实际数据库的数据并没有被删除, 但是 GORM 中查询是没有的。
|
|
- 条件删除 (批量操作)
|
|