如何在Persistent中具有模块间/包间外键约束

时间:2018-03-02 21:31:23

标签: sql postgresql haskell persistent

由于我们的数据库中有很多模型,其中很多都是相当独立的,我们决定在不同的模块中定义它们。然后我们有一个migrateAll函数,它以串行方式运行每次迁移。看起来我们这样做会导致Persistent不在模型之间创建外键约束,但我真的希望那些约束存在。

作为部分修复,我们可以将它们全部放入同一个模块中,但我们还有一个单独的包依赖于第一个包,它在顶部创建了更多模型,同样还有一些外键。当这些包真正只有它们之间的单向依赖时,我们必须将这些包合并为一个真的很麻烦。

是否有任何方法可以跨模块创建外键约束?也许通过使其如果迁移具有外部外键约束的模型,也可以运行外部模型的迁移。为了避免需要按依赖顺序排序迁移。

也可能是因为没有创建外键的原因与此设置无关,但我似乎无法找到其他人遇到同样的问题,所以我假设上述是原因。

对于MCVE:

module Foo where

share [mkPersist sqlSettings, mkMigrate "migrateFoo"] [persistLowerCase|
Foo
    name String
|]
module Bar where

import Foo

share [mkPersist sqlSettings, mkMigrate "migrateBar"] [persistLowerCase|
Bar
    name String
    foo FooId
|]
module Models where

import Foo
import Bar

migrateAll :: Migration
migrateAll = migrateFoo *> migrateBar

运行migrateAll执行我想要的一切,除了在Bar.foo字段上创建外键约束。如何在保持我想要的模块性的同时获得外键约束?

0 个答案:

没有答案