Gorm学习(一)入门:Gorm入门指南
本文最后更新于:1 年前
前言
感谢开源项目gin-vue-admin,以及1010工作室的视频教程
一、GORM介绍
1、GORM概述
GORM一个目前比较热门的,使用简单,对开发人员友好的 Golang ORM 库
。
GORM框架是go的一个数据库连接及交互框架,主要是把struct类型和数据库记录进行映射,数据库语句复杂的情况下可以直接手写语句,一般用于连接关系型数据库,这里我主要使用MySQL数据库。
对象关系映射(英语:Object Relational Mapping,简称ORM): 通过使用描述对象和数据库之间映射的
元数据
,将程序中的对象与关系数据库相互映射
,可以使用面向对象的范例从数据库中查询和操作数据。
简而言之:代码结构即是数据库结构,代码行为就是数据库行为。
2、为什么选择GORM?
特性:
- 数据库连接(以MySQL为例)和自动建表方便。
- 文档内容详细全面,适合快速入门上手。
- 支持关联 (一对一,一对多,多对多的关系)。
- 带有Create,Save,Update,Delete,Find 中钩子方法。
- 支持
Preload、Joins
的预加载,对于关联查询很重要,主要用于显示关联子结构的内容。 - 支持事务,嵌套事务。
- 可以使用Context、预编译模式、DryRun 模式。
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD。
- SQL 构建器,Upsert,
数据库锁
,Optimizer/Index/Comment Hint,命名参数,子查询。 - 复合主键,索引,约束。
- 自定义 Logger。
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 开发者友好。
二、安装
GORM库github地址: https://github.com/go-gorm/gorm
GORM库文档地址:https://gorm.io/zh_CN/docs/
第一步:
很重要,go mod 包管理工具项目的开始都需要先做这一步
1 |
|
第二步:
操作MySQL数据库需要两个包
- GORM包
- MySQL驱动包
1 |
|
或者:
你可以直接在文件里面直接导入这两个库的引用
1 |
|
再用 go mod tidy
的方法自动导入库。
三、快速入门
1 |
|
四、模型定义
GORM负责将对模型的读写操作翻译成sql语句,然后GORM再把数据库执行的sql语句后返回的结果转化为我们定义的模型对象。
1、模型定义介绍
模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成。
例如:
1 |
|
默认gorm对struct字段名使用Snake Case命名风格转换成mysql表字段名(需要转换成小写字母)。
Snake Case命名风格,就是各个单词之间用下划线(_)分隔,首字母大写区分一个单词,例如: CreateTime的Snake Case风格命名为create_time
2、约定
GORM 倾向于约定,而不是配置。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间
遵循 GORM 已有的约定,可以减少您的配置和代码量。如果约定不符合您的需求,GORM 允许您自定义配置它们
3、gorm.Model
GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt
1 |
|
可以将它嵌入到你的结构体中,以包含这几个字段
4、高级选项
1)字段级权限控制
可导出的字段在使用 GORM 进行 CRUD 时拥有全部的权限,此外,GORM 允许您用标签控制字段级别的权限。这样您就可以让一个字段的权限是只读、只写、只创建、只更新或者被忽略
注意: 使用 GORM Migrator 创建表时,不会创建被忽略的字段
1 |
|
2)创建 / 更新时间追踪(纳秒、毫秒、秒、Time)
GORM 约定使用 CreatedAt、UpdatedAt 追踪创建 / 更新时间。如果您定义了这种字段,GORM 在创建、更新时会自动填充 当前时间
要使用不同名称的字段,您可以配置 autoCreateTim、autoUpdateTim 标签
如果您想要保存 UNIX(毫 / 纳)秒时间戳,而不是 time,您只需简单地将 time.Time 修改为 int 即可
1 |
|
3)嵌入结构体
对于匿名字段,GORM 会将其字段包含在父结构体中,例如:
1 |
|
对于正常的结构体字段,你也可以通过标签 embedded 将其嵌入,例如:
1 |
|
并且,您可以使用标签 embeddedPrefix 来为 db 中的字段名添加前缀,例如:
1 |
|
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_INSTREMENT |
size | 指定列大小,例如:size:256 |
primaryKey | 指定列为主键 |
unique | 指定列为唯一 |
default | 指定列的默认值 |
precision | 指定列的精度 |
scale | 指定列大小 |
not null | 指定列为 NOT NULL |
autoIncrement | 指定列为自动增长 |
embedded | 嵌套字段 |
embeddedPrefix | 嵌入字段的列名前缀 |
autoCreateTime | 创建时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano |
autoUpdateTime | 创建 / 更新时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli |
index | 根据参数创建索引,多个字段使用相同的名称则创建复合索引 |
uniqueIndex | 与 index 相同,但创建的是唯一索引 |
check | 创建检查约束,例如 check:age > 13 |
<- | 设置字段写入的权限, <-:create 只创建、**<-:update** 只更新、**<-:false** 无写入权限、**<-** 创建和更新权限 |
-> | 设置字段读的权限,**->:false** 无读权限 |
- | 忽略该字段,**-** 无读写权限 |
5)关联标签
GORM 允许通过标签为关联配置外键、约束、many2many 表
五、连接数据库
GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
1、MySQL
连接MySQL主要有两个步骤:
1)配置DSN (Data Source Name)
- DSN介绍:gorm库使用dsn作为连接数据库的参数,dsn翻译过来就叫数据源名称,用来描述数据库连接信息。一般都包含数据库连接地址,账号,密码之类的信息。
- DSN字段格式:
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&…¶mN=valueN]
1 |
|
2)使用gorm.Open连接数据库
1 |
|
注意:想要正确的处理 time.Time ,您需要带上 parseTime 参数,要支持完整的 UTF-8 编码,您需要将 charset=utf8 更改为 charset=utf8mb4
MySQl 驱动程序提供了 一些高级配置 可以在初始化过程中使用,例如:
1 |
|
1)自定义驱动
GORM 允许通过 DriverName 选项自定义 MySQL 驱动,例如:
1 |
|
2)现有的数据库连接
GORM 允许通过一个现有的数据库连接来初始化 *gorm.DB
1 |
|
3)GORM配置
gorm.Config{}: GORM 提供可以在初始化时使用的配置。
1 |
|
GORM配置详细内容直接看文档,我后续会再写一篇:点击跳转
2、连接池
在高并发实践中,为了提高数据库连接的使用率,避免重复建立数据库连接带来的性能消耗,会经常使用数据库连接池技术来维护数据库连接。
GORM 使用 database/sql 维护连接池
1 |
|
参考GORM中文文档:https://learnku.com/docs/gorm/v2/connecting_to_the_database/9731#64cea3