第二期Go开源说实录:GORM 剖析与最佳实践
共 5280字,需浏览 11分钟
·
2021-01-21 23:33
关联:一对一、一对多、单表自关联、多态关联;Preload、Joins 预加载;关联模式
事务:嵌套事务, Save Point
Hooks、Callbacks 自由扩展
多数据库、读写分离、Prometheus、Prepared Stmt、查询优化器、批量数据处理、代码共享、子查询、DryRun
SQL Builder、Smart Migration、复合主键、自定义类型 (JSON等)、SQL 表达式查询创建更新、虚拟字段…
真 • 跨数据库兼容等功能
Method Chain 的线程安全
https://gorm.cn/zh_CN/docs/method_chaining.html
防止 SQL 注入
https://gorm.cn/zh_CN/docs/security.html
错误处理
https://gorm.cn/zh_CN/docs/error_handling.html
GORM 优于配置的一些约定
https://gorm.cn/zh_CN/docs/models.html#Conventions
如何给字段来配置读写权限
https://gorm.cn/zh_CN/docs/models.html#field_permission
给多字段配置时间追踪
https://gorm.cn/zh_CN/docs/models.html#time_tracking
自关联定义 (一对一,多对多,一对多,单表自关联,多态)、自定义 foreign key, reference、复合外键、自定义 JoinTable
Query 的一些 API: Pluck, FirstOrInit, FirstOrCreate (Assign, Attrs)
https://gorm.cn/zh_CN/docs/advanced_query.html#FirstOrInit
Migrations
https://gorm.cn/zh_CN/docs/migration.html
字段的 Tags 特殊配置支持
https://gorm.cn/zh_CN/docs/models.html#tags
如何使用 Context
https://gorm.cn/zh_CN/docs/context.html
Transactions, Nested Transactions, Save Point, RollbackTo to Saved Point
https://gorm.cn/zh_CN/docs/transactions.html
Gorm Config (跳过默认事务、修改命名策略、修改当前时间函数、只生成 SQL 不执行模式、Prepared Stmt 加速模式等等)
https://gorm.cn/zh_CN/docs/gorm_config.html
Session 模式概念及其配置 (如:跳过默认事务、修改命名策略、修改当前时间函数、只生成 SQL 不执行模式、Prepared Stmt 加速模式等等)
https://gorm.cn/zh_CN/docs/session.html
定义索引、复合索引、优先索引、约束等
https://gorm.cn/zh_CN/docs/indexes.html https://gorm.cn/zh_CN/docs/constraints.html
数据库连接池配置
https://gorm.cn/zh_CN/docs/generic_interface.html
数据库的不同连接参数,以 mysql 为例子
https://github.com/go-gorm/mysql#gorm-mysql-driver
Hooks 介绍
https://gorm.cn/zh_CN/docs/hooks.html
读写分离 / 多数据库
https://gorm.cn/zh_CN/docs/dbresolver.html
使用查询优化器,指定索引查询
https://gorm.cn/zh_CN/docs/hints.html
Prometheus 集成
https://gorm.cn/zh_CN/docs/prometheus.html
使用复合主键
https://gorm.cn/zh_CN/docs/composite_primary_key.html
分库分表 / 代码共享
https://gorm.cn/zh_CN/docs/scopes.html
Embedded Struct 定义共享 struct (参考 embedded tag)
自定义数据类型(json 等数据类型支持)
https://gorm.cn/zh_CN/docs/data_types.html
如何提升性能
https://gorm.cn/zh_CN/docs/performance.html
多看源码,贡献社区 😉
https://github.com/go-gorm/gorm
熟悉 Statement & Clause 概念
https://www2.slideshare.net/JinzhuZhang2/gorm-gopher-china
定制 Callbacks 插件
https://gorm.cn/zh_CN/docs/write_plugins.html
了解如何定制 driver 实现特殊需求 (各 driver 源码,
https://gorm.cn/zh_CN/docs/write_driver.html)
如何定制 logger
https://gorm.cn/zh_CN/docs/logger.html
Set/Get/InstanceSet/InstanceGet Callback 传递参数
https://gorm.cn/zh_CN/docs/settings.html
1.如何设置表名前缀
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_", // NOTE 这里
SingularTable: true,
SingularTable: true,
},
})
默认的 NamingStrategy 可以实现一些常见的配置,如果不能满足需求的话,可以选择自定义 Namer 的 interface,例如:
type Namer interface {
TableName(table string) string
ColumnName(table, column string) string
JoinTableName(table string) string
RelationshipFKName(Relationship) string
CheckerName(table, column string) string
IndexName(table, column string) string
}
import "github.com/DATA-DOG/go-sqlmock"
mockdb, mock, err := sqlmock.New()
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
gormDB, err := gorm.Open(mysql.New(mysql.Config{
Conn: mockdb,
}), &gorm.Config{})
db.Statement
获取当前的条件,然后根据这些条件从相应的其它的数据库、缓存数据库中查询出相应数据并赋值回原对象中。