使用Django South重build迁移历史的build议方法是什么?

我已经积累了很多使用南(0.7)和Django(1.1.2)的迁移,在我的unit testing中开始消耗相当多的时间。 我想重新设置基线并开始一组新的迁移。 我已经回顾了南方的文档 ,做了通常的谷歌/ Stackoverflowsearch(例如“Django南(复位或删除或删除)迁移历史”),并没有发现任何明显的。

我想到的一种方法将涉及到“重新开始”,“删除”南或“手动清除”历史logging(例如,清除数据库表,从迁移指导中删除迁移文件),然后重新运行,

./manage.py schemamigration southtut –initial

所以,如果有人已经这样做了,并有一些提示/build议,他们将不胜感激。

编辑 – 我在下面发表评论,因为在接受@andybak之前接受的答案之前阅读它是很重要的

@Dominique:如果在项目中使用南方的任何第三方应用程序,您的关于manage.py reset south的build议是危险的,并且可能会破坏数据库,如以下@thnee所指出的。 既然你的答案有这么多upvotes,我真的很感激,如果你可以编辑它,并至less添加一个警告,或(更好)改变它反映@ hobs方法(这是一样方便,但不影响其他应用程序) – 谢谢! – 克里夫13年3月26日在9:09

接受的答案如下:

首先, 南方作者的回答是 :

只要你在所有的部署同时做到这一点,这应该不会有任何问题。 就我个人而言,我会这样做:

  rm -r appname/migrations/ ./manage.py reset south ./manage.py convert_to_south appname 

(请注意,“ reset south ”部分将清除所有应用程序的迁移logging,因此请确保您为所有应用程序运行其他两行或select性删除)。

在最后的convert_to_south调用进行新的迁移并伪造它(因为你的数据库已经有相应的表)。 在这个过程中,不需要删除所有的应用程序表。

当我需要摆脱所有这些不必要的开发人员迁移时,以下是我在dev + production服务器上所做的工作:

  1. 确保两边都有相同的数据库模式
  2. 删除两边的每个迁移文件夹
  3. 运行./manage.py重置南(正如post所示)在两边=清除南表*
  4. 在两边运行./manage.py convert_to_south (伪造0001迁移)
  5. 那么我可以重新开始进行迁移,并推送我的服务器上的迁移文件夹

*除了如果你只想清除其中一个应用程序,如果这样你需要编辑你的south_history表,并删除只有关于你的应用程序的条目。

如果您需要select性地(仅适用于一个应用程序)重置迁移时间过长, 这对我有效。

 rm <app-dir>/migrations/* python manage.py schemamigration <app-name> --initial python manage.py migrate <app-name> 0001 --fake --delete-ghost-migrations 

不要忘记在你的<app-dir>/migrations/0001_initial.py添加诸如depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial")) <app-dir>/migrations/0001_initial.py文件,作为迁移类中class Migration(SchemaMigration):之下的第一个属性class Migration(SchemaMigration):

然后你可以通过./manage.py migrate <app-name> --fake --delete-ghost-migrations在其他环境下,按照这个SO的回答 。 当然,如果你伪造删除或伪造的migrate zero你将需要手动删除任何剩余的数据库表,像这样的迁移。

更多的核心选项是在活动部署服务器上执行./manage.py migrate --fake --delete-ghost-migrations ,然后是[my] sqldump。 然后在你需要迁移的,完全填充的数据库的环境中将该转储pipe理到[my] sql中。 我知道南方的亵渎,但是为我工作。

由于多米尼克瓜迪奥拉和滚刀的答案,它帮助我解决了一个难题。 但是,解决scheme有几个问题,这是我的承诺。

如果你有任何使用南方的第三方应用 ,例如django-cms (基本上所有东西都使用南方),使用manage.py reset south 并不是一个好主意

reset south将删除所有已安装的应用程序的所有迁移历史logging。

现在考虑升级到最新版本的django-cms ,它将包含新的迁移,如0009_do_something.py 。 当您尝试在迁移历史logging中没有00010008情况下运行迁移时,南方肯定会感到困惑。

select性地重置您正在维护的应用程序会更好/更安全。


首先,确保您的应用程序在磁盘上的迁移和在数据库上执行的迁移之间没有任何asynchronous。 否则会有头痛。

1.删​​除我的应用程序的迁移历史

 sql> delete from south_migrationhistory where app_name = 'my_app'; 

2.删除我的应用程序的迁移

 $ rm -rf my_app/migrations/ 

3.为我的应用程序创build新的初始迁移

 $ ./manage.py schemamigration --initial my_app 

4.假执行我的应用程序的初始迁移

south_migrationhistory迁移插入到south_migrationhistory而不会触及实际的表格:

 $ ./manage.py migrate --fake my_app 

第3步和第4步实际上只是manage.py convert_to_south my_app一个更长的变体,但是在修改生产数据库这种微妙的情况下,我更喜欢额外的控制。

和thnee一样(请参阅她的回答),我们对南方作者(Andrew Godwin)的build议采用了一种比较温和的方法,这个方法在这里引用了其他地方,我们正在将我们对代码库的操作与我们对数据库的操作,因为我们需要部署是可重复的:

我们在代码中做了什么:

 # Remove all the migrations from the app $ rm -fR appname/migrations # Make the first migration (don't touch the database) $ ./manage.py schemamigration appname --initial 

一旦部署了代码,我们对数据库做了什么

 # Fake the migration history, wiping out the rest $ ./manage.py migrate appname --fake --delete-ghost-migrations 

如果你只是在开发机器上工作,我写了一个pipe理命令,几乎完成了多米尼克build议。

http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html

与南方作者的build议相反,这不会损害其他使用南方的应用程序。

以下只是如果你想重置所有的应用程序。 请在这个工作之前备份你的所有数据库。 如果有的话,还要记下你的depends_on在初始文件中。

一次:

 (1) find . -type d -name migrations -exec git rm -rf '{}' \; (2) find . -type d -name migrations -exec rm -rf '{}' \; (3) ./manage.py schemamigration <APP_NAME> --initial (4) [GIT COMMIT] 

在推送之前testing引导您的项目。 然后,对于每个本地/远程机器,应用以下内容:

 (5) [GIT PULL] (6) ./manage.py reset south (7) ./manage.py migrate --fake 

每个应用程序的初始(3),你想重新涉及。 请注意,reset(6)将只删除迁移历史logging,因此不会对库造成危害。 虚假的迁移(7)将放回安装的任何第三方应用程序的迁移历史logging。

从app文件夹中删除必要的文件

实例path

  cd /usr/local/lib/python2.7/dist-packages/wiki/south_migrations 

维基 – 是我的应用程序