跨Django项目共享数据库

8
我们的产品有一个restful API和一个服务器渲染应用程序(CMS)。两者共享数据库。都是使用Django编写的。
两者所需的字段和模型不是互斥的,有些仅适用于API,有些仅适用于CMS,还有一些是通用的。
我的问题是,如果我在其中一个存储库上运行迁移,它们是否会尝试删除那个特定存储库模型中不存在但其他存储库需要的字段。分别在两个存储库中运行迁移是否会使数据库保持最新状态并避免问题。
4个回答

4

这个问题是通过使用一个与Django无关的模式迁移工具来解决的。我们现在使用yoyo migrations来迁移我们的模式。


4

在我看来,除了合并项目之外,唯一其他有效的选择是关闭Django迁移对公共模型(Meta.managed = False)的自动化,并自行处理表的创建和版本控制。您仍然可以使用django.db.migrations编写迁移脚本,但makemigrations命令不会为这些表执行任何操作。


3
单独在两个仓库中运行迁移是否能保持数据库最新并且不会出现问题呢?
很遗憾,不能。正如您所怀疑的那样,其中一个项目的更改会试图覆盖另一个项目的更改。
最简单的方法是将这两个项目合并为一个项目,这样问题就完全消失了。
如果这不是一个选择,那么代码可以按一定的方式进行组织,使得两个项目共享同一个 models.py 文件。您可以通过只在一个项目中存在 models.py 文件和迁移文件夹来实现此目的。第二个项目可以链接到它使用的每个 models.py 文件。诀窍(也是困难的部分)是确保不会为使用符号链接的应用程序创建迁移。

1
这个方案本来是可行的,但是模型必须被打包成一个可安装的独立项目。这并不是一个坏的解决方案,但我们决定不采用它。我们正在向面向服务架构迈进,所以现在我们正在拆分数据库。 - madhukar93

1
我认为最好的做法是有一个包含所有字段的存储库。该项目将负责应用迁移。
在其他项目中,您需要一个包含函数allow_migrate的db_router,在模型类上返回False。
此外,具有不同数据库权限的不同数据库用户可以防止更改表格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接