登录
首页 >  Golang >  Go教程

Gorm (Postgres) 自增主键自定义类型如何解决?

时间:2024-12-07 08:40:00 106浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Gorm (Postgres) 自增主键自定义类型如何解决?》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

Gorm (Postgres) 自增主键自定义类型如何解决?

解决 gorm (postgres) 自增主键自定义类型的问题

在使用 gorm 与 postgres 时,如果将主键设置为自定义类型(例如 bigint),表自动迁移时无法创建自增。这是因为 gorm 无法识别自定义类型的自增属性。

通过调试 gorm 和 postgres 驱动器的代码,找到了解决办法:

在 bigint 类型中添加 gormdbdatatype 方法,用于指定表字段的数据类型:

func (bigint) gormdbdatatype(db *gorm.db, field *schema.field) string {
  switch db.dialector.name() {
  case "mysql", "sqlite":
    return "bigint"
  case "postgres":
    if field.autoincrement {
      return "bigserial"
    }
    return "bigint"
  }
  return "bigint"
}

gormdbdatatype 方法根据数据库类型返回适当的数据类型。对于 postgres,如果字段是自增的,则返回 "bigserial",否则返回 "bigint"。

修复后的代码:

type GVA_MODEL struct {
  ID BigInt `gorm:"primaryKey;autoIncrement;type:bigint;size:64;->" form:"id" json:"id" query:"id"` // 主键ID
  // ...
}

type BigInt json.Number

// ... (Scan、Value 方法与原代码相同)

func (BigInt) GormDBDataType(db *gorm.DB, field *schema.Field) string {
  switch db.Dialector.Name() {
  case "mysql", "sqlite":
    return "bigint"
  case "postgres":
    if field.AutoIncrement {
      return "bigserial"
    }
    return "bigint"
  }
  return "bigint"
}

通过这个修复,在自动迁移时,postgres 将正确地创建自定义类型 bigint 的主键并将其设置为自增。

好了,本文到此结束,带大家了解了《Gorm (Postgres) 自增主键自定义类型如何解决?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>