设计简介
graph LR
应用程序
subgraph 上层应用
GORM-->id1([操作接口])
end
应用程序-->GORM
subgraph 连接池
database/sql
end
id1--> database/sql
subgraph 数据库Driver
database/sql-->id2([连接接口<br>操作接口])
end
id2-->数据库
- DB连接的几种类型
- 直接连接/Conn
- 预编译/Stmt
- 事务/Tx
- 执行SQL语句一般会返回一个iterator,避免一次将数据全部装入内存产生的内存溢出
GORM设计原理
设计原则
- API精简
- 测试优先
- 灵活扩展
- 无依赖
- 可信赖
- 功能完善
- 约定优于配置,一切皆可配置
SQL生成
结构
db.Where("role<>?","manager").Where("age>?",35).Limit(100).Order("age desc").Find(&user)
- GORM Clauses(由于Chain Method)
- Where
- Limit
- Order
- Finisher Method(决定类型&执行)
- Find
生成
- 自定义 CLause Builder
- 方便扩展 Clause
- 自由选择 Clauses
插件扩展
为了实现灵活定制,自由扩展
- 通过预定义CREATE CALLBACKS
- 执行Create的过程,依此调用注册的Create Callbacks
graph LR
Finisher_Method --> 决定Statement类型
决定Statement类型 --> 执行Callbacks
执行Callbacks --> 生成SQL并执行
- 多租户
- 多数据库、读写分离
- 加密解密、混沌工程
ConnPool
graph LR
G[GORM<br/>gorm.io/gorm]--SQL-->P[ConnPool]
P--DML-->DB_Conn_M
P--DTL-->DB_Conn_T
P--DQL-->DB_Conn_Q
DB_Conn_M--连接池-->数据库
DB_Conn_T--连接池-->数据库
DB_Conn_Q--连接池-->数据库
Dialector
- 定制SQL生成
- 定制GORM插件
- 定制ConnPool
- 定制企业特性逻辑
DB,err := gorm.Open(
bytedgorm.MySQL("p.s.m","db").WithReadReplicas(),
bytedgorm.ConnPool{MaxIdleConns:10,MaxOpenConns:50},
bytedgorm.Logger{LogLevel:logger.Error},
bytedgorm.WithStressTestSupport(),
sqlchaos.WithChaos(sqlchaos.Config{})
)
GORM最佳实践
- 数据序列化和SQL表达式
- SQL表达式更新创建
- SQL表达式查询
- 数据序列化
- 批量数据处理
- 创建、查询、更新
- 批量数据加速操作
- 代码复用(封装)
- 分库分表
- Sharding(gorm.io/sharding)
- 混沌工程
- example.com/gorm/sqlchaos
- gorm.io/gorm
- Logger/Trace
- Migrator(数据库迁移管理)
- Gen代码生成/Raw SQL
- 尽量使用代码生成,而非原生的SQL,因为原生的SQL容易发生SQL注入
- 安全问题
- 以参数传入,会有相应的检查,相对安全
- 拼接字符串,容易引发SQL注入,应该谨慎使用