Gorm有一个奇怪的错误,当我无法使用自动表创建。如果我使用与其他表中引用的外键相同的主键字段名,它将无法正确处理。
工作示例-User.ComID
引用Company.ID
:
type User struct {
gorm.Model
ComID string
Company Company `gorm:"foreignKey:ComID;references:ID"`
}
type Company struct {
ID string `gorm:"primaryKey"`
}
生成以下自动迁移序列:
CREATE TABLE "companies" ("id" text,"name" text,PRIMARY KEY ("id"))
CREATE TABLE "users" ("id" bigserial,"created_at" timestamptz,"updated_at" timestamptz,"deleted_at" timestamptz,"name" text,"com_id" text,PRIMARY KEY ("id"),CONSTRAINT "fk_users_company" FOREIGN KEY ("com_id") REFERENCES "companies"("id"))
,但如果我改变第二个表的ID为ComID
type User struct {
ComID string
Company Company `gorm:"foreignKey:ComID;references:ComID"`
}
type Company struct {
ComID string `gorm:"primaryKey"`
}
一切都停止工作。1 . Gorm试图执行错误的sql代码,此时表用户不存在。
CREATE TABLE "companies" ("com_id" text,"name" text,PRIMARY KEY ("com_id"),CONSTRAINT "fk_users_company" FOREIGN KEY ("com_id") REFERENCES "users"("com_id"))
任何想法如何我可以提供gorm正确的描述(除了创建不同的列名)?
如果有关系,在本例中sql的方言是Postgres。
gom不允许:
引用包含self字段
可以修改代码:关系。第559行
if ref.OwnPrimaryKey {
constraint.Schema = ref.ForeignKey.Schema
constraint.ReferenceSchema = rel.Schema
} else {
constraint.Schema = rel.Schema
constraint.ReferenceSchema = ref.PrimaryKey.Schema
}
if false {
constraint.Schema = ref.ForeignKey.Schema
constraint.ReferenceSchema = rel.Schema
} else {
constraint.Schema = rel.Schema
constraint.ReferenceSchema = ref.PrimaryKey.Schema
}
如果你运行
db.Debug().AutoMigrate(User{})
你会看到它:
CREATE TABLE "companies" ("com_id" text,"name" text,PRIMARY KEY ("com_id"),CONSTRAINT "fk_users_company" FOREIGN KEY ("com_id") REFERENCES "users"("com_id"))