Gorm belongto关系具有相同的外键和引用的主键名称



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"))

最新更新