为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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 驱动的此问题。