Database/sql及GORM相关解读 | 青训营笔记

76 阅读5分钟

Database/sql 及 GORM 相关解读

Database/sql

符合Database/sql接口的driver + DSN 初始化DB连接

DB连接的几种类型:

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

处理返回数据的几种格式:

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

GORM 基础使用

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。

ORM框架:为了解决面型对象与关系数据库存在的互不匹配的现象的框架。

约定优于配置

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

GORM设计原理

gorm作为一个ORM库,它在底层使用了数据库驱动,通过与database/sql接口对接,实现了更高级别的对象关系映射功能。

byteDance6-2.png

SQL是怎么生成的

byteDance6-3.png

易扩展

条件语句

GORM API 方法添加Clauses至GORM Statement

byteDance6-4.png

执行语句

byteDance6-5.png

stmt.Build 进行翻译,stmt.ConnPool.Exec进行执行sql语句

设计优点:

  • 自定义Clause Builder

    不同数据库甚至不同版本的数据库支持的SQL不同 byteDance6-6.png

  • 方便扩展Clause

    可以扩展子句(查询优化器) byteDance6-7.png

  • 自由选择Clause

    选择子句(减少迁移成本) byteDance6-8.png

插件是怎么工作的

byteDance6-9.png

Create:

byteDance6-10.png

byteDance6-11.png

灵活定制、自由扩展 =====》多租户 多数据、读写分离 加解密 混沌工程

多租户

byteDance6-12.png

多数据、读写分离

byteDance6-13.png

ConnPool是什么

graph LR;
a[GORM]-.SQL.->b[ConnPool]-.连接池.->c[数据库]
d[DB Conn]-.实现接口.->b

byteDance6-14.png

byteDance6-15.png

byteDance6-16.png

插件还可以实现:SQL合到一起,等到所有参数一起执行的功能

byteDance6-17.png

byteDance6-18.png

Dialector是什么

byteDance6-19.png

byteDance6-20.png

GORM最佳实践

数据序列化与SQL表达式

SQL表达式更新创建

byteDance6-21.png

SQL表达式查询

byteDance6-22.png

数据序列化

byteDance6-23.png

批量数据操作

byteDance6-24.png

批量更新

byteDance6-25.png

批量数据加速操作

byteDance6-26.png

代码复用、分库分表、Sharding

分页逻辑代码复用

byteDance6-27.png

分库分表

分库分表是在数据库规模庞大、负载高、性能需求提升的情况下考虑的一种数据库架构设计策略。以下是一些常见的情况和考虑因素,可以触发分库分表的需求:

  1. 数据库性能瓶颈:当单个数据库无法满足高并发和大数据量的需求时,分库分表可以通过将数据分散存储在多个数据库中,以提高数据库的读写性能和吞吐量。

  2. 数据库容量限制:当数据库的存储容量达到上限时,可以考虑使用分库分表来扩展数据库的存储能力。

  3. 业务数据隔离:在多租户或多业务系统的场景下,可以将不同的租户或业务数据分散存储在不同的数据库中,以实现数据的隔离和管理。

    多租户:

    多租户(Multi-tenancy)是一种软件架构和部署模式,指的是在一个系统或应用中,多个不同的用户或租户可以共享相同的软件实例和基础设施资源。每个租户都被视为独立的实体,拥有自己的数据、配置和用户权限,但它们在同一个软件系统中共享相同的应用程序代码和基础设施。

    多租户架构旨在提供一种有效的方式,通过单一的软件实例来为多个租户提供服务,从而降低系统部署和维护的成本,并提供可扩展性和资源共享的好处。

    在多租户系统中,每个租户之间的数据和配置是隔离的,每个租户只能访问和管理自己的数据,彼此之间互不干扰。这种架构可以应用于各种场景,如软件即服务(SaaS)平台、云计算环境、企业资源管理系统(ERP)、客户关系管理系统(CRM)等,以满足不同租户的需求并确保数据的安全性和隔离性。

    总而言之,多租户是一种架构模式,允许多个用户或租户共享同一个软件系统和基础设施,但保持彼此的数据和配置的隔离。

  4. 数据库的水平扩展:通过将数据按照某种规则(如数据范围、分片键等)分散存储在多个数据库表中,可以实现数据库的水平扩展,提高系统的整体性能和可伸缩性。

需要注意的是,分库分表并非适用于所有情况,它引入了一定的复杂性和额外的管理成本。在考虑分库分表之前,需要综合评估系统的需求、性能瓶颈、数据访问模式以及成本和维护的可行性等因素。

byteDance6-28.png

sharding

byteDance6-29.png

混沌工程/压测

byteDance6-30.png

byteDance6-31.png

Logger/Trace

byteDance6-32.png

Migrator

在 GORM 中,db.AutoMigrate 方法用于自动创建或更新数据库表结构,以便与定义的 GORM 模型进行匹配。

具体而言,db.AutoMigrate 方法可以执行以下操作:

  1. 创建表:如果数据库中不存在与模型对应的表,则会自动创建该表。
  2. 添加字段:如果模型中定义了新的字段,但数据库表中缺少这些字段,db.AutoMigrate 会在表中添加这些字段。
  3. 修改字段:如果模型中的字段发生了变化,例如字段类型、长度或约束等,db.AutoMigrate 可以更新数据库表中的对应字段。
  4. 删除字段:如果模型中移除了某个字段,但数据库表中仍然存在该字段,db.AutoMigrate 可以删除数据库表中的该字段。

通过调用 db.AutoMigrate 方法,可以确保数据库表的结构与定义的模型保持一致,使得应用程序能够与数据库进行正确的交互和操作。

需要注意的是,db.AutoMigrate 方法仅在模型定义发生变化时才会对数据库表进行修改,因此在进行数据库迁移时,应谨慎使用并确保备份重要数据。

byteDance7-33.png

还有一些其他接口

byteDance6-34.png

Gen代码生成/Raw SQL

byteDance6-35.png

byteDance7-36.png

安全

byteDance6-37.png