sqlmigrate - 使用Django South重建迁移历史记录的建议方法是什么?




python manger py sqlmigrate (5)

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

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

接受的答案如下:

首先, 南方作家的回答是

只要您在所有部署中同时执行此操作,就不会有任何问题。 就我个人而言,我会这样做:

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

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

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

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

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

*除非您只想清除其中一个应用程序,否则您需要编辑您的south_history表并只删除有关您的应用程序的条目。

我已经使用南(0.7)和Django(1.1.2)积累了很多迁移,这些迁移在我的单元测试中开始消耗相当多的时间。 我想重置基准并开始一组新的迁移。 我回顾了南方文档 ,完成了通常的Google / Stackoverflow搜索(例如“django south(重置或删除或删除)迁移历史记录”),但没有发现任何明显的内容。

我设想的一种方法是通过“删除”South或“手动清除”历史记录来“重新开始”(例如,清除db表,从migrations director删除迁移文件)并重新运行,

./manage.py schemamigration southtut --initial

所以,如果有人以前做过这个,并有一些提示/建议,他们将不胜感激。


仅当您想重置所有应用程序时,才会显示以下内容 请在这项工作之前备份您的所有数据库。 如果有初始文件,请记下您的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]

测试在推送之前引导您的项目。 然后,为每个本地/远程机器申请以下内容:

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

每个你想要重新参与的应用做初始(3)。 请注意,reset(6)将仅删除迁移历史记录,因此对库无害。 假的迁移(7)会将所有安装的第三方应用程序的迁移历史放回去。


和thnee一样(请参阅她的回答),我们对南方作者(Andrew Godwin)的建议在这里引用的其他地方使用了一种更温和的方法,并且我们在部署过程中将我们对代码库的操作与我们对数据库的操作分开,因为我们需要部署是可重复的:

我们在代码中做了什么:

# 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


感谢Dominique Guardiola和滚刀的回答,它帮助我解决了一个难题。 然而,解决方案存在一些问题,这里是我的看法。

如果您有任何使用South的第三方应用程序 ,例如django-cms (基本上所有内容都使用South),则使用manage.py reset south 并不是一个好主意

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

现在考虑升级到最新版本的django-cms ,它将包含新的迁移,例如0009_do_something.py 。 如果尝试在迁移历史记录中没有00010008情况下运行该迁移,South肯定会感到困惑。

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

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

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

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

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

$ rm -rf my_app/migrations/

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

$ ./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一个更长的变体,但我更喜欢这种额外的控制,在修改生产数据库等微妙的情况下。





django-south