第三方驱动适配
GORM 通过驱动适配器支持多种数据库,本文分析主流驱动的兼容性与特性差异。
驱动列表
官方支持驱动
| 驱动 | 包路径 | 版本要求 | 特性 |
|---|---|---|---|
| MySQL | gorm.io/driver/mysql | >= 5.7 | 完整支持,性能最优 |
| PostgreSQL | gorm.io/driver/postgres | >= 9.6 | 支持数组、JSONB |
| SQLite | gorm.io/driver/sqlite | >= 3 | 嵌入式,无服务端 |
| SQL Server | gorm.io/driver/sqlserver | >= 2017 | 支持 T-SQL 语法 |
| ClickHouse | gorm.io/driver/clickhouse | >= 21 | OLAP 场景 |
初始化方式
MySQL
Go
import "gorm.io/driver/mysql"
dsn := "user:pass@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
PostgreSQL
Go
import "gorm.io/driver/postgres"
dsn := "host=localhost user=postgres password=pass dbname=mydb port=5432 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
SQLite
Go
import "gorm.io/driver/sqlite"
db, err := gorm.Open(sqlite.Open("mydb.db"), &gorm.Config{})
SQL Server
Go
import "gorm.io/driver/sqlserver"
dsn := "sqlserver://localhost:1433?database=mydb&encrypt=disable"
db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
特性差异
数据类型映射
| GORM 类型 | MySQL | PostgreSQL | SQLite | SQL Server |
|---|---|---|---|---|
| string | varchar(255) | varchar(255) | text | nvarchar(255) |
| int | int | integer | integer | int |
| bool | tinyint(1) | boolean | integer | bit |
| time.Time | datetime | timestamptz | datetime | datetime2 |
| []byte | blob | bytea | blob | varbinary |
特殊功能支持
| 功能 | MySQL | PostgreSQL | SQLite | SQL Server |
|---|---|---|---|---|
| 全文索引 | ✅ | ✅ | ❌ | ✅ |
| JSON 字段 | ✅ | ✅ (JSONB) | ❌ | ✅ |
| 数组类型 | ❌ | ✅ | ❌ | ❌ |
| 部分索引 | ❌ | ✅ | ✅ | ✅ |
| 事务保存点 | ✅ | ✅ | ✅ | ✅ |
| 批量插入优化 | ✅ | ✅ | ✅ | ✅ |
DDL 差异
Go
// AutoMigrate 在各驱动下生成的 DDL 不同
db.AutoMigrate(&User{})
// MySQL:
// CREATE TABLE users (id bigint PRIMARY KEY, name varchar(255), ...)
// PostgreSQL:
// CREATE TABLE users (id bigserial PRIMARY KEY, name varchar(255), ...)
// SQLite:
// CREATE TABLE users (id integer PRIMARY KEY, name text, ...)
驱动适配原理
接口定义
Go
// GORM 方言接口
type Dialector interface {
Name() string
Initialize(*DB) error
Migrator() Migrator
DataTypeOf(*schema.Field) string
DefaultValueOf(*schema.Field) clause.Expression
BindVarTo(writer clause.Writer, stmt *Statement, v interface{})
QuoteTo(writer clause.Writer, column string)
Explain(sql string, vars ...interface{}) string
}
各驱动实现该接口,GORM 在运行时根据当前 Dialector 生成对应方言的 SQL。
注册机制
Go
// 驱动通过 callbacks.Register 注册特定数据库的回调
// 例如 PostgreSQL 注册 JSON 处理回调
// MySQL 注册批量插入优化回调
注意事项
不同驱动对事务隔离级别支持不同,跨库迁移需确认兼容性。
SQLite 不支持并发写,高并发场景需加写锁或使用 WAL 模式。
SQL Server 的分页语法与其他驱动差异大,GORM 内部做了适配。
PostgreSQL 的
ON CONFLICT语法与 MySQLINSERT IGNORE语义不同。
要点总结
- GORM 通过 Dialector 接口实现多数据库适配
- 各驱动在数据类型、特殊功能、DDL 生成上存在差异
- MySQL 性能最优,PostgreSQL 功能最丰富
- SQLite 适合嵌入式场景,不支持并发写
- 跨库迁移需注意语法差异与功能兼容性
存放路径:D:\git2\jwdev\articles\GORM\专家\生态与工具链\第三方驱动适配.md
📝 发现内容有误?点击此处直接编辑