mulan-dbx 是一个基于 GORM 的轻量数据库扩展库。
它会根据配置中的 DSN 自动选择数据库驱动,帮助业务项目更快接入数据库。
- 按
DSN自动识别数据库类型 - 支持
MySQL - 支持
PostgreSQL - 支持
SQLite(Pure-Go) - 提供统一的连接池配置
- 提供 GORM Logger 接入
- 提供通用基础模型
Model
go get github.com/mulan-ext/dbxmysql://user:pass@127.0.0.1:3306/dbname
postgres://user:pass@127.0.0.1:5432/dbname
sqlite3://:memory:
sqlite3://testdata/app.db
package main
import (
"log"
"github.com/mulan-ext/dbx"
)
func main() {
cfg := &dbx.Config{
DSN: "sqlite3://:memory:",
}
db, err := dbx.Auto(cfg)
if err != nil {
log.Fatal(err)
}
_ = db
}package main
import (
"log"
"github.com/mulan-ext/dbx"
)
func main() {
cfg := &dbx.Config{
DSN: "mysql://root:123456@127.0.0.1:3306/mulan",
Debug: true,
Args: map[string]string{
"parseTime": "true",
"loc": "Local",
},
}
db, err := dbx.Auto(cfg)
if err != nil {
log.Fatal(err)
}
_ = db
}package main
import (
"log"
"github.com/mulan-ext/dbx"
)
func main() {
cfg := &dbx.Config{
DSN: "postgres://postgres:123456@127.0.0.1:5432/mulan",
Args: map[string]string{
"sslmode": "disable",
"TimeZone": "Asia/Shanghai",
},
}
db, err := dbx.Auto(cfg)
if err != nil {
log.Fatal(err)
}
_ = db
}type Config struct {
Conn *ConnConfig
Args map[string]string
DSN string
User string
Pass string
Name string
Debug bool
Migrate bool
}| 字段 | 说明 |
|---|---|
DSN |
数据库连接地址 |
User |
覆盖 DSN 中的用户名 |
Pass |
覆盖 DSN 中的密码 |
Name |
覆盖 DSN 中的数据库名 |
Args |
追加或覆盖查询参数 |
Debug |
是否开启 GORM Debug |
Migrate |
是否启用自动迁移标记 |
Conn |
连接池配置 |
type ConnConfig struct {
Idle int
Open int
Lifetime int
}| 字段 | 说明 |
|---|---|
Idle |
最大空闲连接数 |
Open |
最大打开连接数 |
Lifetime |
连接最大复用时间,单位秒 |
cfg := (&dbx.Config{
DSN: "postgres://olduser:oldpass@127.0.0.1:5432/olddb",
User: "newuser",
Pass: "newpass",
Name: "newdb",
}).Parse()
println(cfg.String())cfg := (&dbx.Config{
DSN: "postgres://postgres:123456@127.0.0.1:5432/mulan",
}).
WithArgs("sslmode", "disable").
WithArgs("TimeZone", "Asia/Shanghai").
Parse()package main
import (
"log"
"github.com/glebarez/sqlite"
"github.com/mulan-ext/dbx"
"gorm.io/gorm"
)
func main() {
cfg := (&dbx.Config{
DSN: "sqlite3://:memory:",
}).Parse()
db, err := dbx.New(
sqlite.Open(cfg.String()),
cfg,
&gorm.Config{
Logger: dbx.NewLogger(cfg.Debug),
},
)
if err != nil {
log.Fatal(err)
}
_ = db
}如果你需要完全自定义驱动和 GORM 配置,建议直接使用
dbx.New(...)。
如果你只想按DSN自动识别数据库,建议使用dbx.Auto(...)。
库内部默认会设置一部分 GORM 配置:
QueryFields: trueDisableForeignKeyConstraintWhenMigrating: trueIgnoreRelationshipsWhenMigrating: true
这几个默认值更偏向“基础库保守模式”,目的是:
- 避免迁移时自动创建外键
- 降低关系迁移带来的误操作风险
- 让库项目默认行为更稳一些
如果你的业务项目有特殊要求,建议自己传入 gorm.Config 做覆盖。
项目内置了通用基础模型:
type Model struct {
ID uint64
UUID uuid.UUID
CreatedAt int64
UpdatedAt int64
}特性:
ID自增主键UUID自动生成CreatedAt自动创建时间UpdatedAt自动更新时间
示例:
type User struct {
dbx.Model
Name string `gorm:"column:name"`
}cfg := &dbx.Config{
DSN: "sqlite3://:memory:",
Debug: true,
}开启后会输出更详细的 SQL 日志,适合开发和排查问题。
- 开发环境:可开启
Debug - 测试环境:按需开启
- 生产环境:建议关闭详细 SQL 日志
这是库项目接入时最容易忽略的部分。
错误示例:
log.Println(cfg.DSN)因为 DSN 里通常包含:
- 用户名
- 密码
- 主机地址
- 数据库名
直接打印会泄露敏感信息。
开启调试后,SQL 和参数可能一起输出。
如果你的业务 SQL 参数中包含敏感字段,会有泄露风险,例如:
- 密码
- Token
- 手机号
- 邮箱
- 身份证号
建议:
- 关闭详细 SQL 日志
- 不要打印完整数据库连接串
- 不要把数据库账号密码写入普通业务日志
虽然库默认对迁移行为做了保守处理,但生产环境仍不建议随意执行自动迁移。
更推荐:
- 开发环境可用
- 测试环境按流程执行
- 生产环境走明确的数据库变更流程
如果你把数据库配置写在配置文件中,建议:
- 不提交真实密码到公开仓库
- 使用环境变量或密钥管理服务
- 限制配置文件读取权限
当前推荐的测试策略:
- 单元测试:默认执行
- SQLite 内存库测试:默认执行
- 真实 MySQL / PostgreSQL 集成测试:建议单独执行,不作为默认测试路径
执行测试:
go test ./...请检查 DSN 是否带有正确协议头,例如:
mysql://postgres://sqlite3://
因为它:
- 不依赖外部数据库服务
- 启动快
- 适合单元测试和冒烟测试
建议:
- 简单接入:用
Auto() - 需要精细控制 dialector / gorm.Config:用
New()
- 使用
sqlite3://:memory:或本地数据库 - 可开启
Debug - 可按需自动迁移
- 优先 SQLite
- 集成测试再连接真实数据库
- 日志按需开启
- 使用明确的 MySQL / PostgreSQL 配置
- 关闭 Debug
- 避免打印敏感配置
- 自动迁移谨慎使用
如果要把 mulan-dbx 作为长期维护的公共基础库,建议继续补强:
- 增加更明确的配置校验
- 增加敏感信息脱敏能力
- 增加错误分类
- 增加更多 README 示例
- 拆分单元测试与集成测试
MIT