【问题标题】:How to delete a table with relationships in GORM?如何在 GORM 中删除具有关系的表?
【发布时间】:2019-04-19 16:20:50
【问题描述】:

我删除了对象,并希望在关系表中也删除它的 ID。我该怎么做? 即具有关系的对象被删除,但它们的关系表仍然存在。

还想问,GORM 是 Go-Gin 最好的 ORM 解决方案吗?

【问题讨论】:

  • 我想你问的是cascading deletes,它更多的是关于 SQL 而不是 Go,但我不确定。你能提供一个更具体的例子吗?至于“最好的工具”问题,we avoid best/favorite sorts of questions;答案取决于你在做什么。
  • 我说错了,ORM 可以进行自己的级联删除。不知道GORM能不能。
  • 有些表中对象的关系是通过它们的id来注册的。删除对象时,这些关系仍然存在,因此只会占用服务器上的空间。我不知道如何从代码中访问这些表以手动删除它们,因为这些表是自动创建的,并且不存在于我的模型中。
  • “通过 id 注册的对象的关系”听起来像 foreign keys。但听起来您的架构没有正确声明其外键。不幸的是,这很常见。外键会阻止您删除对象,同时留下引用。将外键声明为“在删除级联时”将在您删除主对象时删除引用行。我建议您阅读有关级联删除的 SQL 教程。

标签: go go-gorm go-gin


【解决方案1】:

尝试将外键和ON DELETE CASCADE 显式添加到您的模型中。我发现 GORM 在涉及到这种事情时可能会变得不确定,但明确地这样做似乎总能使其发挥作用。

例如:

type Person struct {
    ID      int
    Bio     Biography `gorm:"Foreignkey:PersonID;"`
    Name    string
}

type Biography struct {
    ID       int
    Content  string
    PersonID int    `sql:"type:bigint REFERENCES people(id) ON DELETE CASCADE"`
}

注意:您必须指定将调用的实际数据库列和表,而不是字段。由于 GORM 自动将表格复数并将其转换为蛇形大小写,因此我引用了 people(id) 列。如果您覆盖此功能,请使用您拥有的任何表和列名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多