设计模式之 Database/SQL 与 GORM 实践
Database/sql 及 GORM 相关解读
连接接口
driver用结构体写
import顺序
操作接口
Exec/ExecContext->Result
Query/QueryContext->Rows(Columns)
QueryRow/QueryRowContext->Row(Rows简化)
处理返回数据的几种方式
GORM 设计简洁、功能强大、自由扩展的全功能ORM
约定优于配置,一切都可配置
Preload/Joins预加载
级联删除
GORM 设计原理
SQL生成
Chain Method 子句 ->GORM Clauses
Finisher Method 决定类型&执行
GORM API方法添加Clauses 至GORM Statement
GORM Finisher方法执行GORM Statement
- 为什么?
- 自定义Clause Builder
- 方便扩展Clause
- 自由选择Clauses
插件扩展
Callback
例如:执行Create的过程,依次调用注册的Create Callbacks
- 为什么? 灵活定制、自由扩展
- 多租户
- 多数据库、读写分离
- 加解密、混沌工程
ConnPool
全局模式,所有DB操作都会预编译并缓存(缓存不含参数部分)
会话模式,后续会话的操作都会预编译并缓存
Dialector
定制SQL生成
定制GORM插件
定制ConnPool
定制企业特性逻辑
Bytedgorm 字节内部封装的gorm,不用调参
GORM 最佳实践
数据序列化与SQL表达式
- SQL表达式更新创建
- 方法1:通过gorm.Expr使用SQL表达式
- 方法2:通过GORMValuer使用SQL表达式/SubQuery
- 方法3:通过*gorm.DB使用SubQuery
- SQL表达式查询
- 方法1:使用gorm.Expr
- 方法2:Struct定义GORMValuer
- 方法3:自定义查询SQL实现接口clause.Expression
- 方法4:SubQuery
- 数据序列化
批量数据操作
批量创建
批量查询
批量更新
- 批量数据加速操作
- 方法1:关闭默认事务
- 方法2:默认批量导入会调用Hooks方法,使用“SkipHooks”跳过
- 方法3:使用Prepared Statement
- 混合使用
代码复用、分库分表、Sharding
混沌工程/压测
Logger/Trace
链路追踪
Migrator
AutoMigrate 自动迁移数据库
Gen代码生成/Raw SQL
安全
预防SQL注入
这节课主要针对字节跳动内部需求,感觉除了大厂,很少会考虑数据库的操作