GORM 设计与实践 | 青训营笔记

77 阅读1分钟

GORM 设计与实践

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

GORM 设计与实践

1 理解 database/sql

1.1 基本用法

import driver 实现

使用 driver + DSN 初始化 DB 连接

1.2 设计原理

image.png

2 GORM 基础使用

2.1 背景知识

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

功能完善:

  • 关联:一对一、一对多、单表自关联、多态; Preload、Joins预加载、级联删除; 关联模式;自定义关联表
  • 事务:事务代码块、嵌套事务、Save Point
  • 多数据库、读写分离、命名参数、Map、子查询、分组条件、代码共享、 SQL表达式(查询、创建、更新)、 自动选字段、查询优化器
  • 字段权限、软删除、批量数据处理、 Prepared Stmt、自定义类型、命名策略、 虚拟字段、自动 track时间、SQL Builder、 Logger代码生成、复合主键、Constraint、 Prometheus、Auto Migration、 真跨数据库兼容...
  • 多模式灵活自由扩展
  • Developer Friendly

2.2 CRUD

2.3 惯例约定

约定优于配置

  • 表名为 struct name 的 snake_cases 复数格式
  • 字段名为 field name 的 snake_case 单数格式
  • ID/Id字段为主键,如果为数字, 则为自增主键
  • CreatedAt字段,创建时,保存当前时间
  • UpdatedAt字段,创建、更新时, 保存当前时间
  • gorm.DeletedAt 字段,默认开启 soft delete 模式

2.4 关联操作

3 GORM 设计原理

image.png

3.1 SQL 是怎么生成的

  • 自定义 Clause Builder
  • 方便扩展 Clause
  • 自由选择 Clauses

image.png

3.2 插件是怎么工作的

image.png

image.png

3.3 ConnPool是什么

image.png

4 GORM 最佳实践

  • 数据序列化与 SQL 表达式
  • 批量数据操作
  • 代码复用、分库分表、Sharding
  • 混沌工程
  • Logger / Trace
  • Migrator
  • Gen 代码生成 / Raw SQL
  • 安全