go-gorm / gen

Gen: Friendly & Safer GORM powered by Code Generation
https://gorm.io/gen/
MIT License
2.22k stars 290 forks source link

表中含有UNIQUE KEY 生成的model 在 AutoMigrate 时 失败 #1183

Open mimicode opened 1 month ago

mimicode commented 1 month ago

表结构:

CREATE TABLE `mytable` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8mb4_bin NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_uni` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

gen 配置:

g := gen.NewGenerator(gen.Config{
        OutPath:           "query",
        OutFile:           "",
        ModelPkgPath:     "",
        WithUnitTest:      false,
        FieldNullable:     true,
        FieldCoverable:    false,
        FieldSignable:     true,
        FieldWithIndexTag: true,
        FieldWithTypeTag:  true,
        Mode:              gen.WithoutContext | gen.WithQueryInterface | gen.WithDefaultQuery, // generate mode
    })

生成的结构体model

// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.

package tables

const TableNameMytable = "mytable"

// Mytable mapped from table <mytable>
type Mytable struct {
    ID   uint32 `gorm:"column:id;type:int(10) unsigned;primaryKey;autoIncrement:true" json:"id"`
    Name string `gorm:"column:name;type:varchar(100);not null;uniqueIndex:name_uni,priority:1" json:"name"`
}

// TableName Mytable's table name
func (*Mytable) TableName() string {
    return TableNameMytable
}

执行表迁移,当表已存在时

err := db.Migrator().AutoMigrate(tables.Mytable{})

结果:

Error 1091 (42000): Can't DROP 'uni_mytable_name'; check that column/key exists
[4.703ms] [rows:0] ALTER TABLE `mytable` DROP FOREIGN KEY `uni_mytable_name`                                                                                                          
Error 1091 (42000): Can't DROP 'uni_mytable_name'; check that column/key exists

跟踪代码发现是因为 Migrator 工具判断是否有唯一键是通过union 而不是union key

go/pkg/mod/gorm.io/gorm@v1.25.11/migrator/migrator.go:580

qqxhb commented 1 month ago

所以这个问题是 定义的name_uni有问题,还是migrator的实现有问题呢? 如果是前者是不是该下定义,如果是后者辛苦直接gorm库提一个issue