GORM操作SQLite时自定义ID的autoIncrement自增属性不生效问题
解决方案
问题根因
GORM的AutoMigrate方法默认不会修改已存在表的主键约束,如果你在第一次生成表时没有给ID字段加自增配置,后续补加tag后再次执行AutoMigrate不会更新已有主键的自增属性,这是该问题的最常见诱因。另外低版本GORM对SQL Server的自增主键tag适配存在缺陷,也可能导致配置不生效。
具体解决步骤
- 首先升级你的GORM到v1.23.0及以上的稳定版本,避免版本兼容问题。
- 如果你不需要保留现有表的数据,直接删除数据库中已生成的
Equipement表,再重新执行AutoMigrate,首次建表时GORM会正确解析primaryKey;autoIncrement标签生成带自增属性的主键。 - 如果需要保留数据,或者删除表后仍然不生效,可以在ID字段的tag中显式指定SQL Server的自增类型,修改后的结构体写法如下:
// Equipement type Equipement struct { ID int `gorm:"primaryKey;type:int identity(1,1);not null"` IP string `gorm:"not null"` Username string `gorm:"not null"` AuthPass string `gorm:"not null"` AuthProtocol string `gorm:"not null"` PrivatePass string `gorm:"not null"` PrivateProtocol string `gorm:"not null"` }
- 验证配置生效:开启GORM的SQL日志输出,执行
AutoMigrate时查看生成的建表语句,ID字段是否带有IDENTITY(1,1)标识,有则代表配置生效。开启日志的示例代码如下:
import ( "gorm.io/gorm/logger" "gorm.io/driver/sqlserver" "gorm.io/gorm" ) // 初始化DB时开启日志 db, err := gorm.Open(sqlserver.Open("你的DSN连接串"), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), })
注意事项
插入数据时不要手动为ID字段赋值,GORM会识别到自定义ID赋值跳过自增逻辑,导致自增配置不生效。
内容的提问来源于stack exchange,提问作者uPong26
相关产品推荐
相关产品推荐

