database/sql与GROM | 青训营笔记

98 阅读3分钟

前言

在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 设计原理

image.png

[连接池]

image.png

[连接池配置]

image.png

[连接池状态]

image.png

[操作过程伪实现]

image.png

[Driver 连接接口]

注册:

image.png

连接:

image.png

连接简洁写法:

image.png

[DB连接类型]

  • 直接连接/Conn
  • 预编译/Stmt
  • 事务/Tx

[处理返回数据]

  • Exec/ ExecContext-> Result
  • Query / QueryContext -> Rows(Columns)
  • QueryRow / QueryRowContext-> Row (Rows简化)

2. RM使用简介

【背景】

设计简洁、功能强大、自由扩展的全功能ORM\color{blue}{设计简洁、功能强大、自由扩展的全功能ORM}

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

功能完善:

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

2.1 基本用法

image.png image.png

【CRUD】

image.png

2.2 Model定义

image.png

2.3 惯例约定

约定优于配置

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

一切皆可配置

gorm.io/ldocs/conve…

2.4 关联操作

【介绍】

image.png

【CRUD】

image.png

【Preload/Joins 预加载】

image.png

【级联删除】

image.png

3. GORM设计原理

image.png

3.1 SQL生成

image.png image.png

GORM API方法添加Clauses至GORM Statement :

image.png image.png

【为什么】

  • 自定义Clause Builder
image.png
  • 方便扩展 Clause---扩展子句
image.png
  • 自由选择 Clauses---选择子句
image.png

3.2 插件扩展

【如何工作的】

image.png image.png image.png

【为什么】

灵活定制、自由扩展

  • 多租户
image.png
  • 多数据库、读写分离
image.png
  • 加解密、混沌工程..

3.3 ConnPool

【定义】

image.png image.png
  • 查找缓存的顶编译SOL
  • 未找到,将收到的SQL和Vars预编译
  • 使用缓存的预编译SQL执行
image.png

【最初的问题】

image.png

本是解决数据注入的问题,但现在大多用的UTF-8,没有这类问题

image.png

3.4 Dialector

连接作用

image.png image.png

4. GORM最佳实践

  • 数据序列化与SQL表达式

[更新创建]

image.png

[查询]

image.png

[数据序列化]

image.png
  • 批量数据操作

[批量创建/查询]

image.png

[更新]

image.png

[数据加速操作]

image.png
  • 代码复用、分库分表、Sharding

[代码复用]

image.png

[分库分表]

image.png

[sharding]

image.png
  • 混沌工程/压测
image.png image.png
  • Logger / Trace
image.png
  • Migrator-数据库迁移管理
image.png image.png
  • Gen 代码生成/ Raw sQL

[Raw]

image.png

[Gen]

image.png
  • 安全
image.png