设计模式之DATABASE/SQL与GORM设计与实践 | 青训营笔记

357 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记

一、 本堂课重点内容

1.      理解database/sql

Database/sql基本用法。设计原理,基础概念介绍

2.      Grom使用简介

Grom基本用法,Model定义,惯例约定,关联介绍

3.      Grom设计原理

SQL生成,扩展机制,ConnPool,Dialector等

4.      Grom最佳实践

Grom最佳实践,企业级开发,FAQ等

二、 详细知识点介绍

2.1 基本用法

image.png 代码分析:

行1-8:import driver实现,使用driver+DSN初始化DB连接

行10-14:执行一条SQL,通过rows取回返回的数据,处理完毕,释放连接

行16-26:数据错误处理

行28-30:错误处理

2.2设计原理

image.png DB连接的几种类型:直接连接/Conn,预编译/stmt,事务/Tx

处理返回数据的几种方式:

Exec /ExecContext -Result

Query QueryContext -Rows (Columns)

QueryRow/QueryRowContext->Row(Rows简化)

2.3 Grom基础使用

2.3.1 背景知识

设计原则:API精简,测试优先,最小惊讶,灵活扩展,无依赖,可信赖

功能完善:

关联:一对一、一对多、单表自关联、多态;Preload、Joins预加载、级联删除;关联模式;自定义关联表

事务:事务代码块、嵌套事务、Save Point

多数据库、读写分离、命名参数、Map、子查询、分组条件、代码共享、SQL表达式(查询、创建、更新)、自动选字段、查询优化器

字段权限、软删除、批量数据处理、Prepared Stmt、.自定义类型、命名策略、虚拟字段、自动track时间、SQL Builder、Logger

代码生成、复合主键、Constraint、Prometheus、Auto Migration、真·跨数据库兼容…

多模式灵活自由扩展

Developer Friendly

2.3.2 基本用法-CRUD

image.png

image.png 2.3.3 模型定义

image.png 约定:

表名为struct name的snake cases复数格式

字段名为field name的snake_case单数格式

ID/Id字段为主键,如果为数字,则为自增主键

CreatedAt字段,创建时,保存当前时间

UpdatedAt字段,创建、更新时,保存当前时间

gorm.DeletedAt字段,默认开启soft delete模式

2.3.4 关联介绍

image.png 关联操作-CRUD

image.png 关联操作-Preload/Joins预加载

image.png 关联操作-级联删除 image.png

2.4 Gorm设计原理

       2.4.1 SQL是如何生成的

image.png        GORM API 方法添加Clauses至GORM Statement

image.png        GORM Finisher方法执行GORM Statement

image.png        自定义Builder

image.png        扩展子句

image.png        选择子句

image.png        2.4.2 插件是怎么工作的

image.png

image.png 多租户

image.png        多数据库,读写分离

image.png        2.4.3 ConnPool是什么

image.png 在全局模式下,所有DB操作都会预留编译并缓存(缓存不包含参数部分)

连接池作用:

查找缓存的预编译SQL

未找到,将收到的SQL和Vars预编译

使用缓存的预编译SQL执行

       2.4.4 Dialector

       定制SQL生成

       定制GORM插件

       定制ConnPool

       定制企业特性逻辑

三、 实践练习例子

3.1 数据序列化与SQL表达式

SQL表达式更新创建 image.png SQL表达式查询 image.png 数据序列化 image.png

3.2批量数据操作

批量创建/查询 image.png 批量更新 image.png 批量数据加速操作

image.png

3.3代码复用,分库分表。Sharding

代码复用

image.png 分库分表

image.png Sharding

image.png

3.4混沌工程/压测

image.png

image.png

3.5 Logger/Trace

image.png

image.png

3.6数据库迁移

image.png

3.7 Gen代码生成/Raw SQL

image.png

image.png

3.8安全问题

image.png

四、 课后个人总结

这节课主要介绍了GORM框架的相关使用,在基础的CRUD上讲述了设计原理,底层的代码实现,以及对一些底层数据结构的操作。能帮助更好的使用此框架。

五、 引用参考

github.com/go-gorm/gor…

gorm.io/https://gor…