Gorm(Postgres)自定义类型主键无法设置自增?

前提:

  1. gorm.io/gorm v1.25.1
  2. gorm.io/driver/postgres v1.5.0

原因,主键在表自动迁移时无法创建自增。

附代码如下,之所以给主键设置为自定义类型,主要是考虑了bigint在前端可能会丢失精度的问题。现在别的都正常,就是自动创建表时,不会设置为自增。

type GVA_MODEL struct {
 ID BigInt `gorm:"primaryKey;autoIncrement:true;type:bigint;size:64;->" form:"id" json:"id" query:"id"` // 主键ID
 // ...
}
// 自定义类型,让客户端以string形式处理BigInt类型的数据
type BigInt json.Number
// Scan 实现 sql.Scanner 接口,Scan 将 value 扫描至 BigInt
func (bigint *BigInt) Scan(value interface{}) error {
 bytes, ok := value.(int64)
 if !ok {
 return errors.New(fmt.Sprint("Failed to unmarshal Int64 value:", value))
 }
 var result = json.Number(strconv.FormatInt(bytes, 10))
 *bigint = BigInt(result)
 return nil
}
// Value 实现 driver.Valuer 接口,Value 返回 BigInt value
func (bigint BigInt) Value() (driver.Value, error) {
 if len(bigint) == 0 {
 return nil, nil
 }
 return json.Number(bigint).Int64()
}
func (BigInt) GormDBDataType(db *gorm.DB, field *schema.Field) string {
 // 根据不同的数据库驱动返回不同的数据类型
 switch db.Dialector.Name() {
 case "mysql", "sqlite":
 return "bigint"
 case "postgres":
 return "bigint"
 }
 return "bigint"
}
作者:赞原文地址:https://segmentfault.com/q/1010000043834582

%s 个评论

要回复文章请先登录注册