注册

Golang 通过 GORM 自动迁移表结构修改字段时如果 gorm 标签存在 comment 属性则报错

子兮子兮 2023/11/01 716 0

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8 DB Version: 0x7000c
【操作系统】:Windows 11 专业版
【CPU】: Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz 3.10 GHz
【问题描述】*:Golang 通过 GORM 自动迁移表结构修改字段时如果 gorm 标签存在 comment 属性则报错

如以下 GORM 模型结构体和字段:

type SysSerialNumber struct { /* ... */ DeleteAt gorm.DeletedAt `gorm:"column:delete_at;comment:删除时间"` }

GORM 自动迁移时,如果表字段已存在,修改表结构时会执行以下 SQL 并报错:

ALTER TABLE "sys_serial_number" MODIFY "delete_at" TIMESTAMP WITH TIME ZONE COMMENT '删除时间' -- Error -2007: 第 1 行, 第 120 列[COMMENT]附近出现错误:

官方提供的 DM8 GORM v2 驱动相关代码:

func (m Migrator) FullDataTypeOf(field *schema.Field) clause.Expr { expr := m.Migrator.FullDataTypeOf(field) if value, ok := field.TagSettings["COMMENT"]; ok { expr.SQL += " COMMENT " + m.Dialector.Explain("?", value) } return expr } func (m Migrator) AlterColumn(value interface{}, field string) error { return m.RunWithValue(value, func(stmt *gorm.Statement) error { if field := stmt.Schema.LookUpField(field); field != nil { return m.DB.Exec( "ALTER TABLE ? MODIFY ? ?", clause.Table{Name: stmt.Table}, clause.Column{Name: field.DBName}, m.FullDataTypeOf(field), ).Error } return fmt.Errorf("failed to look up field with name: %s", field) }) }

可以看到 GORM 驱动 migrator.go 文件中的 AlterColumn 方法调用了 FullDataTypeOf 方法,从而将 COMMENT ? 拼接到 ALTER TABLE ? MODIFY ? ? 语句之后,
但是 DM8 貌似不支持 ALTER TABLE ? MODIFY ? ? COMMENT ? 语法,从而导致报错,望修复 GORM v2 驱动的此问题。

回答 0
暂无回答
扫一扫
联系客服