Golang 微服框架 Kratos 与它的小伙伴系列 - ORM 框架 - GORM
Golang 微服框架 Kratos 与它的小伙伴系列 - ORM 框架 - GORM
什么是 ORM?
面向对象编程和关系型数据库,都是目前最流行的技术,但是它们的模型是不一样的。
面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。
简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。
ORM 把数据库映射成对象。
数据库的表(table) --> 类(class)
记录(record,行数据)--> 对象(object)
字段(field)--> 对象的属性(attribute)
举例来说,下面是一行 SQL 语句。
程序直接运行 SQL,操作数据库的写法如下。
改成 ORM 的写法如下。
一比较就可以发现,ORM 使用对象,封装了数据库操作,因此可以不碰 SQL 语言。开发者只使用面向对象编程,与数据对象直接交互,不用关心底层数据库。
ORM 有下面这些优点:
数据模型都在一个地方定义,更容易更新和维护,也利于重用代码。
ORM 有现成的工具,很多功能都可以自动完成,比如数据消毒、预处理、事务等等。
它迫使你使用 MVC 架构,ORM 就是天然的 Model,最终使代码更清晰。
基于 ORM 的业务代码比较简单,代码量少,语义性好,容易理解。
你不必编写性能不佳的 SQL。
ORM 也有很突出的缺点:
ORM 库不是轻量级工具,需要花很多精力学习和设置。
对于复杂的查询,ORM 要么是无法表达,要么是性能不如原生的 SQL。
ORM 抽象掉了数据库层,开发者无法了解底层的数据库操作,也无法定制一些特殊的 SQL。
什么是 GORM?
GORM 是基于 Go 语言实现的 ORM 库,它是 Golang 目前比较热门的数据库 ORM 操作库,对开发者也比较友好,使用非常方便简单。
最重要的是,它是一个正经的国产开源库。支持国产!
特性
全功能 ORM
关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
Create,Save,Update,Delete,Find 中钩子方法
支持 Preload、Joins 的预加载
事务,嵌套事务,Save Point,Rollback To Saved Point
Context、预编译模式、DryRun 模式
批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
复合主键,索引,约束
Auto Migration
自定义 Logger
灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
每个特性都经过了测试的重重考验
开发者友好
安装库
除此以外,还需要安装数据库的驱动:
GORM 的一些数据库基本操作
因为数据库是复杂的,SQL 是复杂的,复杂到能够出好几本书,所以是绝不可能在简单的篇幅里面讲完整,只能够将常用的一些操作(连接数据库、CURD)拿来举例讲讲。
连接数据库
MySQL
PostgreSQL
SQLite
SQL Server
Clickhouse
自动迁移 Automatic Migration
自动迁移功能,会创建表、缺失的外键、约束、列和索引。
定义模型
gorm.Model
则是包含了通用的一些字段,比如:id、创建时间、更新时间、删除时间等……
在默认的情况下:
表名,将会被转换为 复数形式 以及 蛇形命名法(snake_case),比如:
User
转换为users
。字段名,将被转换为 蛇形命名法(snake_case) 字符串,比如:
UserName
被转换为user_name
。
当然,你也可以用column
标明字段名的输出:
定义TableName()
方法控制表名的输出:
增 Create
删 Delete
改 Update
查 Read
与 Kratos 携起手来
官方推荐的包结构是这样的:
|- data
|- biz
|- service
|- server
那么,我们可以把模型定义做成一个 package,放到 data 文件夹下面去:
|- data
| |- modal
|- biz
|- service
|- server
创建数据库客户端
在data/data.go
文件中添加创建 Gorm 数据库客户端的方法NewGormClient
:
并将之注入到ProviderSet
需要说明的是数据库迁移工具,如果数据库中不存在表,迁移工具会创建一个;如果字段存在改变,迁移工具会对字段进行修改。
创建 UseCase
在 biz 文件夹下创建user.go
:
注入到biz.ProviderSet
创建 Repo
在data
文件夹下创建user.go
文件,实际操作数据库的操作都在此处。
注入到data.ProviderSet
在 Service 中调用
注入到service.ProviderSet
将服务注册到 gRPC 服务器当中去:
这样,我们就有了一个完整的用户服务
。
评论