跨 Django 项目共享数据库
shared DB across django projects
我们的产品有一个 restful API 和一个服务器呈现的应用程序(CMS)。两者共享数据库。两者都是用 django
写的
两者所需要的字段和模型并不互斥,有的是API独有的,有的是CMS特有的,有的是通用的。
我的问题是,如果我 运行 在其中一个回购协议上进行迁移,他们会尝试删除该特定回购协议的模型中不存在的字段,而这些字段是其他。 运行在两个存储库中分别进行迁移是否会使数据库保持最新状态并且不会造成问题。
Will running the migrations individually in both repos keep the database up to
date and not pose a problem.
很遗憾,没有。正如您所怀疑的那样,其中一个的更改将尝试覆盖另一个。
最简单的方法是将两个项目合并为一个,这样这个问题就完全消失了。
如果这不是一个选项,是否可以按照两个项目共享相同 models.py 文件的方式组织代码?您可以通过让 models.py 文件和迁移文件夹仅存在于一个项目中来实现这一点。第二个项目可以有一个指向它使用的每个 models.py 文件的符号链接。诀窍(也是困难的部分)是确保您永远不会为使用符号链接的应用程序创建迁移。
恕我直言,唯一有效的选项(除了合并项目)是关闭通用模型上的 Django 迁移自动化(Meta.managed = False),并将 table 创建和版本控制掌握在自己手中。您仍然可以使用 django.db.migrations 编写迁移脚本,但是 makemigrations 命令不会对这些 table 执行任何操作。
我认为最好的办法是拥有一个包含所有字段的存储库。该项目将负责应用迁移。
在其他项目中,您将需要一个包含函数 allow_migrate 的 db_router,它将 return 在您的模型上为 False 类。
也有不同的数据库用户具有不同的数据库权限可以防止改变表。
这已通过使用 Django 自己的外部架构迁移工具解决。我们用
yoyo migrations 现在迁移我们的架构。
我们的产品有一个 restful API 和一个服务器呈现的应用程序(CMS)。两者共享数据库。两者都是用 django
写的两者所需要的字段和模型并不互斥,有的是API独有的,有的是CMS特有的,有的是通用的。
我的问题是,如果我 运行 在其中一个回购协议上进行迁移,他们会尝试删除该特定回购协议的模型中不存在的字段,而这些字段是其他。 运行在两个存储库中分别进行迁移是否会使数据库保持最新状态并且不会造成问题。
Will running the migrations individually in both repos keep the database up to date and not pose a problem.
很遗憾,没有。正如您所怀疑的那样,其中一个的更改将尝试覆盖另一个。
最简单的方法是将两个项目合并为一个,这样这个问题就完全消失了。
如果这不是一个选项,是否可以按照两个项目共享相同 models.py 文件的方式组织代码?您可以通过让 models.py 文件和迁移文件夹仅存在于一个项目中来实现这一点。第二个项目可以有一个指向它使用的每个 models.py 文件的符号链接。诀窍(也是困难的部分)是确保您永远不会为使用符号链接的应用程序创建迁移。
恕我直言,唯一有效的选项(除了合并项目)是关闭通用模型上的 Django 迁移自动化(Meta.managed = False),并将 table 创建和版本控制掌握在自己手中。您仍然可以使用 django.db.migrations 编写迁移脚本,但是 makemigrations 命令不会对这些 table 执行任何操作。
我认为最好的办法是拥有一个包含所有字段的存储库。该项目将负责应用迁移。
在其他项目中,您将需要一个包含函数 allow_migrate 的 db_router,它将 return 在您的模型上为 False 类。
也有不同的数据库用户具有不同的数据库权限可以防止改变表。
这已通过使用 Django 自己的外部架构迁移工具解决。我们用 yoyo migrations 现在迁移我们的架构。