设计模式之 Database/SQL 与 GORM 实践

59 阅读2分钟

设计模式之 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注入

这节课主要针对字节跳动内部需求,感觉除了大厂,很少会考虑数据库的操作