我一直试图在我们的Golang项目中实现GORM Orm,但似乎我有一个小问题。
其中一个结构体有一个循环依赖项,所以现在当我尝试AutoMigrate创建表时,我会得到错误,因为GORM试图按顺序创建表。
示例原型:
message Person{
optional string name= 1;
optional Company company = 2;
}
message Company{
optional string name= 1;
optional Workers workers= 2;
}
message Workers {
optional string name= 1;
optional Person person= 2;
}
这是一个简单的例子,但正是我的循环依赖。当我使用gorm插件生成proto时,它会生成带有所有gorm注解的模型,包括foregin键。当然,当我尝试自动迁移它们时,它会崩溃。
我找到的唯一解决办法就是
1.从“公司”中删除“员工”字段。
1.生成GORM模型。
1.运行autoMigrate。
1.重构proto文件并将Workers字段返回给Company。
1.运行autoMigrate。
1.我们所有的table都有合适的FK。
我试着在网上搜索任何想法,但似乎找不到任何想法。
任何帮助/想法都很感激!
1条答案
按热度按时间uurv41yg1#
我能够通过这种方法实现你所需要的。不幸的是,我不太熟悉
proto
消息,所以我只分享你应该使用的相对Go代码。如果我没有记错的话,您在proto
消息中定义的关联将被转换为GORM
中的belongsTo
。否则,您应该使用repeated
关键字(我说的对吗?).在前提之后,我将分享代码,然后是解释。
好吧,让我带你浏览一下相关的部分。
structs定义
在这里,您必须预测每个关联都可能是
NULL
。这就是为什么我使用指针来定义它们的原因。因此,你可以创建一个像这样的循环依赖:人员=>公司=>工人=>人员=>....
另外,我通过设置
people
覆盖了结构Person
的表名。也许,GORM
足够聪明,可以自己做到这一点,但从未尝试过。SQL对象定义
当你示例化一个
gorm
客户端时,你必须确保在你迁移的时候没有创建外键。要实现这一点,必须在gorm.Config
结构中将字段DisableForeignKeyConstraintWhenMigrating
设置为true
。因此,外键的创建取决于您。后者是通过CreateConstraint
方法完成的,在该方法中指定:最后,您可以注意到,我运行
AutoMigrate
方法来创建没有外键的表。写入逻辑
由于表的布局,
INSERT
逻辑必须分为两部分。在第一个中,您将记录插入到它们自己的表中(例如Person
到people
表中,Company
到companies
中,依此类推)。我们故意将外键留给NULL
,否则我们会得到一个错误。如果相关的记录还没有被插入,第一个总是会引发一个错误。然后,我们使用
Update
方法将每个外键设置为正确的值。最后的想法
我在代码中留下了一些注解语句,以证明如果您试图将某个不存在的值指定为外键,它会中断。这意味着您可以在这些列中插入
NULL
或右值。我使用这个软件包
"github.com/samber/lo"
来轻松地从一个字面量(例如:1
)。让我知道这是否有助于解决您的问题,谢谢!