前言
在GO语言的数据库使用中,database/sql包可以使利用统一的接口操作不同的数据库;以及简洁、功能强大的GROM对象关系映射框架给Go带来的提升。
目录
-
database/sql
- 基本用法
- 设计原理
-
RM使用简介
- 基本用法
- Model定义
- 惯例约定
- 关联操作
-
GORM设计原理
- SQL生成
- 插件扩展
- ConnPool
- Dialector
-
GORM最佳实践
1. database/sql
1.1 基本用法
【Quick Start】
import (
"database/sql"
"github.com/ go-sql-driver/mysql"
)
func main( {
db,err := sql.0pen("mysql","user:passwordetcp(127.0.0.1:3306)/hello")
//import driver 实现,使用driver + DSN初始化DB连接
rows,err := db.Query("select id,name from users where id = ?",1)
if err != nil
{
//xxx
}
defer rows.Close()//在打印过程中,处理泄漏问题
//执行一条SQL,通过rows取回返回的数据处理完毕,需要释放链接
var users User
for rows.Next()
{
var user User
err := rows.Scan(&user. ID,&user.Name)
if err !- nil
{
//...
}
users = append(users,user)
}
//数据、错误处理
if rows.Err() != nil
{
//...
}//处理错误
}
1.2 设计原理
[连接池]
[连接池配置]
[连接池状态]
[操作过程伪实现]
[Driver 连接接口]
注册:
连接:
连接简洁写法:
[DB连接类型]
- 直接连接/Conn
- 预编译/Stmt
- 事务/Tx
[处理返回数据]
- Exec/ ExecContext-> Result
- Query / QueryContext -> Rows(Columns)
- QueryRow / QueryRowContext-> Row (Rows简化)
2. RM使用简介
【背景】
设计原则: API精简、测试优先、最小惊讶、灵活扩展、无依赖可信赖
功能完善:
- 关联:一对一、一对多、单表自关联、多态;Preload、Joins预加载、级联删除;关联模式﹔自定义关联表
- 事务:事务代码块、嵌套事务、Save Point
- 多数据库、读写分离、命名参数、Map、子查询、分组条件、代码共享、SQL表达式(查询、创建、更新)、自动选字段、查询优化器
- 字段权限、软删除、批量数据处理、Prepared Stmt、自定义类型、命名策略、虚拟字段、自动track时间、SQL Builder、Logger
- 代码生成、复合主键、Constraint、Prometheus、Auto Migration、真·跨数据库兼容...
- 多模式灵活自由扩展
- Developer Friendly
2.1 基本用法
【CRUD】
2.2 Model定义
2.3 惯例约定
约定优于配置
- 表名为struct name的snake_cases复数格式
- 字段名为field name的snake_case单数格式
- ID/ld字段为主键,如果为数字,则为自增主键
- CreatedAt字段,创建时,保存当前时间
- UpdatedAt字段,创建、更新时,保存当前时间
- gorm.DeletedAt字段,默认开启soft delete模式
一切皆可配置
2.4 关联操作
【介绍】
【CRUD】
【Preload/Joins 预加载】
【级联删除】
3. GORM设计原理
3.1 SQL生成
GORM API方法添加Clauses至GORM Statement :
【为什么】
- 自定义Clause Builder
- 方便扩展 Clause---扩展子句
- 自由选择 Clauses---选择子句
3.2 插件扩展
【如何工作的】
【为什么】
灵活定制、自由扩展
- 多租户
- 多数据库、读写分离
- 加解密、混沌工程..
3.3 ConnPool
【定义】
- 查找缓存的顶编译SOL
- 未找到,将收到的SQL和Vars预编译
- 使用缓存的预编译SQL执行
【最初的问题】
本是解决数据注入的问题,但现在大多用的UTF-8,没有这类问题
3.4 Dialector
连接作用
4. GORM最佳实践
- 数据序列化与SQL表达式
[更新创建]
[查询]
[数据序列化]
- 批量数据操作
[批量创建/查询]
[更新]
[数据加速操作]
- 代码复用、分库分表、Sharding
[代码复用]
[分库分表]
[sharding]
- 混沌工程/压测
- Logger / Trace
- Migrator-数据库迁移管理
- Gen 代码生成/ Raw sQL
[Raw]
[Gen]
- 安全