Django 如何在安装脚本中自动化南部迁移

Django 如何在安装脚本中自动化南部迁移,django,installation,data-migration,django-south,Django,Installation,Data Migration,Django South,我有一个使用South的Django项目,其中包括一个安装脚本。我想做的是在安装脚本中有几行代码,负责安装我的数据库并将其与我的最新代码同步,以便项目的新安装可以轻松地设置数据库 我可以跑 python manage.py migrate --fake 0010 appname1 python manage.py migrate --fake 0004 appname2 …但我无法将其放入安装脚本中,因为(1)我事先不知道迁移号,(2)我不希望安装脚本与应用程序名称保持最新 我需要的是: py

我有一个使用South的Django项目,其中包括一个安装脚本。我想做的是在安装脚本中有几行代码,负责安装我的数据库并将其与我的最新代码同步,以便项目的新安装可以轻松地设置数据库

我可以跑

python manage.py migrate --fake 0010 appname1
python manage.py migrate --fake 0004 appname2
…但我无法将其放入安装脚本中,因为(1)我事先不知道迁移号,(2)我不希望安装脚本与应用程序名称保持最新

我需要的是:

python manage.py migrate --fake --allmigrations --allapps

有什么诀窍吗?

一般来说,在部署过程中不应该使用--false。Fake意味着它实际上没有运行迁移,如果您的用例说您总是要使用Fake(因为您是手工进行迁移的),那么您为什么还要费心尝试将它们放到部署脚本中呢


也就是说。如果您确实打算使用部署脚本运行迁移,那么这相对来说是微不足道的。只需运行manage.py迁移。没有应用程序名称,没有迁移号码。您甚至可以执行manage.py migrate——假迁移,它将假迁移所有应用程序的所有迁移。如果你这样做,真正的问题是你为什么要麻烦。

附议@John的问题,你为什么要使用
--false
进行部署?无论如何,不管怎样,
migrate
migrate appname
只会对所有应用程序/指定应用程序运行所有未应用的迁移。与
--fake
@Beres的情况相同,请参见下面我对@John的回复。这是针对新安装的,因此我假设运行syncdb会将最新型号放入数据库,从而消除迁移的需要。在那之后,是的,我确实想迁移,但是如果一个新用户正在安装软件,并且它附带了十几个迁移,他们不应该运行它们,对吗?不,实际上他们应该(通常)运行它们。假设新用户签出了您的存储库。一旦他们得到它,你的应用程序已经安装,并且处于迁移控制之下,那么syncdb将对这些应用程序不做任何操作,而运行迁移(从0001_initial开始)实际上将创建整个数据库,以补充为什么某些应用程序会对该规则进行例外。随着时间的推移,一个应用程序可能会进行数百次迁移。有时,这些可能需要很长时间才能运行,甚至由于定义不清的依赖关系而出现从头开始运行的问题。有时,在这些情况下,让新的安装说明(或脚本)禁用south并使用syncdb,然后启用south并伪造所有迁移更容易。这是一个例外,而不是规则。这澄清了问题。所以South的syncdb将认识到这是一个新安装,将设置South在应用程序上使用之前存在的模式,然后将东西向前迁移?在这种情况下,我必须对早期迁移有所突破。在“新”安装上,不存在任何模式。如果模式已经存在,那么它不是新安装,您需要——伪造迁移,直到模式匹配迁移为止。如果它真的是一个新的安装,south将从头开始创建完整的模式。但是,在这种情况下,最常见的问题之一是您没有实际测试从头开始创建架构,也没有正确设置依赖项: