【问题标题】:How can I append to a many-to-many relation in Gorm without upserting the already-existing associated rows?如何在不更新已经存在的关联行的情况下附加到 Gorm 中的多对多关系?
【发布时间】:2020-10-07 23:45:09
【问题描述】:

如何在不让 GORM 执行查询以 UPSERT 现有模型的情况下以多对多关联的方式将模型与已存在的其他模型相关联?

例子:

假设我有两个相互关联的 GORM 模型:

type A struct {
    ID int `gorm:"primaryKey"`
    Bs []B `gorm:"many2many:a_bs;"`
}

type B struct {
    ID int `gorm:"primaryKey"`
    As []A `gorm:"many2many:a_bs;"`
}

假设我创建了两个 As:

a1 := A{}
db.Create(&a1)

a2 := A{}
db.Create(&a2)

这将按预期产生以下查询:

INSERT INTO "as" DEFAULT VALUES RETURNING "id"
INSERT INTO "as" DEFAULT VALUES RETURNING "id"

然后假设我想创建一个 B 并将其与 As 相关联:

b := B{
    As: []A{a1, a2},
}
db.Create(&b)

这将导致以下查询:

INSERT INTO "as" ("id") VALUES (3),(4) ON CONFLICT DO NOTHING RETURNING "id"
INSERT INTO "a_bs" ("b_id","a_id") VALUES (3,3),(3,4) ON CONFLICT DO NOTHING
INSERT INTO "bs" DEFAULT VALUES RETURNING "id"

如何消除第一个查询,它会不必要地插入已插入的 A 模型?

使用

b := B{}
db.Create(&b)
db.Model(&b).Association("As").Append([]A{a1, a2})

对于第二位代码反而具有相同的效果。添加 Omit("As") 子句将取消整个插入。

【问题讨论】:

    标签: go orm go-gorm


    【解决方案1】:
    db.Omit("As.*").Create(&b)
    

    gorm Associations : Skip Auto Create/Update 文档上有一个注释,详细说明了这一点。很容易错过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多