674 字
3 分钟
GORM配置项

GORM 配置项#

基础配置#

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
SkipDefaultTransaction: true,
PrepareStmt: true,
NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_",
SingularTable: true,
NameReplacer: strings.NewReplacer("CID", "Cid"),
},
Logger: logger.Default.LogMode(logger.Warn),
})

常用 gorm.Config#

配置作用使用建议
SkipDefaultTransaction写操作不自动包裹默认事务只有确认业务不依赖默认事务且完成压测后再开启
PrepareStmt缓存 prepared statement适合重复 SQL;注意 statement 和连接资源开销
NamingStrategy表名、列名和关系名命名策略项目启动时统一设置,避免中途改变
LoggerSQL、耗时和错误日志开发用 Info,生产通常 Warn/Error
NowFunc自定义时间来源测试固定时间或统一时区时使用
DryRun只生成 SQL,不真正执行调试和测试 SQL 形状
TranslateError尝试把驱动错误转换为 GORM 通用错误仍需保留原始错误用于排查
DisableForeignKeyConstraintWhenMigratingAutoMigrate 时不创建外键约束只有有明确迁移策略时使用
CreateBatchSize设置批量创建默认批次大批量导入时结合数据库限制调节
DisableNestedTransaction禁用嵌套事务的保存点行为需要理解事务边界后再改

命名策略#

NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_", // users -> t_users
SingularTable: true, // User -> user
NoLowerCase: false,
IdentifierMaxLength: 64,
}

命名策略属于全局约定。项目已经上线后不要随意修改,否则同一模型可能映射到另一张表。

单个模型需要覆盖表名时:

func (Order) TableName() string {
return "orders_archive"
}

日志配置#

newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: 200 * time.Millisecond,
LogLevel: logger.Warn,
IgnoreRecordNotFoundError: true,
ParameterizedQueries: true,
Colorful: false,
},
)

ParameterizedQueries: true 可以避免日志打印完整参数,降低敏感数据泄露风险;需要排查具体参数时,应在受控环境短暂调整日志,而不是长期打开。

Session 级配置#

不是所有配置都应该放到初始化阶段。一次操作需要特殊行为时,使用 Session:

// 只允许这个操作无条件更新,慎用
err := db.Session(&gorm.Session{
AllowGlobalUpdate: true,
}).Model(&User{}).Update("status", "inactive").Error
// 只对这次会话启用 Debug
db.Session(&gorm.Session{Logger: logger.Default.LogMode(logger.Info)}).
Where("id = ?", id).
First(&user)

避免把 AllowGlobalUpdate 设置到全局配置;无条件更新和删除应默认被拦截。

Debug、DryRun 和 ToSQL#

// 临时打印本次操作的 SQL
db.Debug().Where("email = ?", email).First(&user)
// 只构建 SQL,不发送到数据库
stmt := db.Session(&gorm.Session{DryRun: true}).
Where("age > ?", 18).
Find(&users).Statement
fmt.Println(stmt.SQL.String(), stmt.Vars)

DryRun 适合检查 SQL 结构,但不能证明数据库实际执行计划、索引选择或权限都正确。

配置分层建议#

  • 应用启动配置:数据库驱动、gorm.Config、日志、命名策略。
  • 环境配置:DSN、连接池、日志级别、慢 SQL 阈值。
  • 请求级配置:WithContext、Debug、超时和事务。
  • 测试配置:SQLite/临时数据库、DryRun、固定 NowFunc。

官方资料#

GORM配置项
https://shirone.mysqil.com/posts/gorm/gorm配置项/
作者
HikariTish
发布于
2026-07-30
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取