GORM | 青训营笔记

231 阅读1分钟

设计简介

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

插件扩展

为了实现灵活定制,自由扩展

  1. 通过预定义CREATE CALLBACKS
  2. 执行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注入,应该谨慎使用