说人话的 GORM文档 之 GORM 配置

35 min read

Config 是 GORM 提供的一个结构体,它包含了一些配置选项,可以在初始化时使用。下面是 Config 结构体中的一些常用配置选项:

  • SkipDefaultTransaction:为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它。
  • NamingStrategy:GORM 允许用户通过覆盖默认的命名策略来更改命名约定。
  • Logger:允许通过覆盖此选项更改 GORM 的默认 logger。
  • NowFunc:更改创建时间使用的函数。
  • DryRun:生成 SQL 但不执行,可以用于准备或测试生成的 SQL。
  • PrepareStmt:在执行任何 SQL 时都会创建一个 prepared statement 并将其缓存,以提高后续的效率。
  • AllowGlobalUpdate:启用全局 update/delete。

下面是一个简单的示例,演示如何在初始化时使用 Config 结构体:

db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
    SkipDefaultTransaction: true,
    NamingStrategy: schema.NamingStrategy{
        TablePrefix:   "t_",
        SingularTable: true,
    },
    Logger: logger.Default.LogMode(logger.Info),
    NowFunc: func() time.Time {
        return time.Now().Local()
    },
    DryRun: false,
    PrepareStmt: false,
    AllowGlobalUpdate: false,
})

自定义NamingStrategy

GORM 允许用户通过覆盖默认的命名策略来更改命名约定。默认的命名策略提供了一些选项,例如设置表名前缀或使用单数表名。下面是一个如何覆盖默认命名策略并使用一些选项的示例 :

db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
    NamingStrategy: schema.NamingStrategy{
        TablePrefix:   "t_", // 表名前缀,`User` 的表名将为 `t_users`
        SingularTable: true, // 使用单数表名,启用此选项后,`User` 的表名将为 `user`
    },
})

自定义Logger

GORM 具有默认的日志记录器实现,它默认会打印慢 SQL 和发生的错误。日志记录器接受一些选项,您可以在初始化时自定义它。例如 :

newLogger := logger.New(
    log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
    logger.Config{
        SlowThreshold: time.Second, // 慢 SQL 阈值
        LogLevel:      logger.Silent, // 日志级别
        IgnoreRecordNotFoundError: true, // 忽略 ErrRecordNotFound 错误
        Colorful:      false, // 禁用颜色
    },
)

db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
    Logger: newLogger,
})

自定义NowFunc

GORM 允许您更改创建新时间戳时使用的函数。您可以在初始化时使用 NowFunc 选项进行更改。例如 :

db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
    NowFunc: func() time.Time {
        return time.Now().Local()
    },
})