GORM 提供的配置可以在初始化时使用

  1. type Config struct {
  2. SkipDefaultTransaction bool
  3. NamingStrategy schema.Namer
  4. Logger logger.Interface
  5. NowFunc func() time.Time
  6. DryRun bool
  7. PrepareStmt bool
  8. DisableNestedTransaction bool
  9. AllowGlobalUpdate bool
  10. DisableAutomaticPing bool
  11. DisableForeignKeyConstraintWhenMigrating bool
  12. }

跳过默认事务

为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它。

  1. db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  2. SkipDefaultTransaction: true,
  3. })

命名策略

GORM 允许用户通过覆盖默认的NamingStrategy来更改命名约定,这需要实现接口 Namer

  1. type Namer interface {
  2. TableName(table string) string
  3. SchemaName(table string) string
  4. ColumnName(table, column string) string
  5. JoinTableName(table string) string
  6. RelationshipFKName(Relationship) string
  7. CheckerName(table, column string) string
  8. IndexName(table, column string) string
  9. }

默认 NamingStrategy 也提供了几个选项,如:

  1. db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  2. NamingStrategy: schema.NamingStrategy{
  3. TablePrefix: "t_", // table name prefix, table for `User` would be `t_users`
  4. SingularTable: true, // use singular table name, table for `User` would be `user` with this option enabled
  5. NoLowerCase: true, // skip the snake_casing of names
  6. NameReplacer: strings.NewReplacer("CID", "Cid"), // use name replacer to change struct/field name before convert it to db name
  7. },
  8. })

Logger

允许通过覆盖此选项更改 GORM 的默认 logger,参考 Logger 获取详情

NowFunc

更改创建时间使用的函数

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

DryRun

生成 SQL 但不执行,可以用于准备或测试生成的 SQL,参考 会话 获取详情

  1. db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  2. DryRun: false,
  3. })

PrepareStmt

PreparedStmt 在执行任何 SQL 时都会创建一个 prepared statement 并将其缓存,以提高后续的效率,参考 会话 获取详情

  1. db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  2. PrepareStmt: false,
  3. })

禁用嵌套事务

在一个事务中使用 Transaction 方法,GORM 会使用 SavePoint(savedPointName)RollbackTo(savedPointName) 为你提供嵌套事务支持,你可以通过 DisableNestedTransaction 选项关闭它,查看 Session 获取详情

AllowGlobalUpdate

启用全局 update/delete,查看 Session 获取详情

DisableAutomaticPing

在完成初始化后,GORM 会自动 ping 数据库以检查数据库的可用性,若要禁用该特性,可将其设置为 true

  1. db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  2. DisableAutomaticPing: true,
  3. })

DisableForeignKeyConstraintWhenMigrating

AutoMigrateCreateTable 时,GORM 会自动创建外键约束,若要禁用该特性,可将其设置为 true,参考 迁移 获取详情。

  1. db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  2. DisableForeignKeyConstraintWhenMigrating: true,
  3. })