
解决 gorm (postgres) 自增主键自定义类型的问题
在使用 gorm 与 postgres 时,如果将主键设置为自定义类型(例如 bigint),表自动迁移时无法创建自增。这是因为 gorm 无法识别自定义类型的自增属性。
通过调试 gorm 和 postgres 驱动器的代码,找到了解决办法:
在 bigint 类型中添加 gormdbdatatype 方法,用于指定表字段的数据类型:
PhpEIP企业信息化平台主要解决企业各类信息的集成,能把各种应用系统(如内容管理系统,网上商城,论坛系统等)统一到企业信息化平台中,整个系统采用简单易用的模板引擎,可自定义XML标签,系统采用开放式模块开发,符合开发接口的模块可完全嵌入到平台;内容管理模块可自定义内容模型,系统自带普通文章模型和图片集模型,用户可以定义丰富的栏目构建企业门户,全站可生成静态页面,提供良好的搜索引擎优化;会员管理模
0
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) 自增主键自定义类型如何解决?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号