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

What's the recommended approach to resetting migration history using Django South?

我使用South(0.7)和Django(1.1.2)积累了相当多的迁移,它们开始在我的单元测试中消耗大量的时间。我想重新设置基线并开始一组新的迁移。我查看了South文档,完成了通常的Google/StackOverflow搜索(例如"Django South(重置或删除或删除)迁移历史"),没有发现任何明显的内容。

我设想的一种方法是"重新开始",通过"删除"南方或"清除"历史记录(例如,清除数据库表,从迁移控制器中删除迁移文件),然后重新运行,

./manage.py schemamigration southtut --initial

因此,如果有人以前做过这些,并且有一些建议/建议,他们会非常感激。


如果你需要有选择地(只为一个应用程序)重置耗时太长的迁移,这对我很有效。

1
2
3
rm /migrations/*
python manage.py schemamigration  --initial
python manage.py migrate  0001 --fake  --delete-ghost-migrations

不要忘记手动恢复对其他应用程序的依赖性,方法是在您的/migrations/0001_initial.py文件中添加诸如depends_on = (("","0001_initial"),("","0001_initial"))这样的行,作为迁移类中位于class Migration(SchemaMigration):正下方的第一个属性。

然后,您可以在其他环境中使用./manage.py migrate --fake --delete-ghost-migrations,根据这样的答案。当然,如果您伪造删除或伪造migrate zero,那么您需要通过这样的迁移手动删除任何剩余的db表。

一个更为核心的选择是在实况部署服务器上执行./manage.py migrate --fake --delete-ghost-migrations,然后执行一个[我的]sqldump。然后在需要迁移的、完全填充的数据库的环境中,将转储到[my]SQL中。南方的亵渎,我知道,但为我工作。


EDIT - I'm putting a comment below at the top of this as it's important to read it before the > accepted answer that follows @andybak

@Dominique: Your advice regarding manage.py reset south is dangerous
and may destroy the database if there are any third party apps using
south in the project, as pointed out by @thnee below. Since your
answer has so many upvotes I'd really appreciate it if you could edit
it and add at least a warning about this, or (even better) change it
to reflect @hobs approach (which is just as convenient, but doesn't
affect other apps) - thanks! – chrisv Mar 26 '13 at 9:09

接受的回答如下:

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

As long as you take care to do it on all deployments simultaneously, there shouldn't be any problem with this. Personally, I'd do:

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

(Notice that the"reset south" part clears migration records for ALL apps, so make sure you either run the other two lines for all apps or delete selectively).

The convert_to_south call at the end makes a new migration and fake-applies it (since your database already has the corresponding tables). There's no need to drop all the app tables during the process.

当我需要消除所有这些不必要的dev迁移时,以下是我在dev+生产服务器上所做的:

  • 确保两边都有相同的DB模式
  • 删除两侧的每个迁移文件夹
  • run./manage.py reset south(如文章所述)on both sides=清除南表*
  • 运行./manage.py在两侧将_转换为_South(伪造0001迁移)
  • 然后我可以重新开始迁移并推送服务器上的迁移文件夹
  • *除非你只想清理其中一个应用程序,否则你需要编辑你的South_History表,只删除关于你的应用程序的条目。


    多亏了多米尼克·瓜迪奥拉和霍布斯的回答,它帮助我解决了一个难题。不过,这个解决方案有几个问题,下面是我的看法。

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

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

    现在考虑升级到最新版本的django-cms,它将包含新的迁移,如0009_do_something.py。当你试图在移民历史上不让0001通过0008的情况下进行移民时,南方肯定会感到困惑。

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

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

    1。删除我的应用程序的迁移历史记录

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

    号2。删除我的应用程序的迁移

    1
    $ rm -rf my_app/migrations/

    三。为我的应用程序创建新的初始迁移

    1
    $ ./manage.py schemamigration --initial my_app

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

    这将在不接触实际表的情况下插入到south_migrationhistory中的迁移:

    1
    $ ./manage.py migrate --fake my_app

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


    像thnee(见她的答案)一样,我们对本文其他地方引用的South Author(Andrew Godwin)建议使用了更温和的方法,我们将代码库的处理与部署期间对数据库的处理分开,因为我们需要可重复的部署:

    我们在代码中所做的:

    1
    2
    3
    4
    # 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

    一旦部署了代码,我们将如何处理数据库

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


    如果您只是在开发机器上工作,我编写了一个管理命令,它执行Dominique建议的大部分操作。

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

    与South作者的建议相反,这不会损害使用South的其他已安装应用程序。


    从应用文件夹中删除必要的文件

    实例路径

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

    wiki-是我的应用程序


    只有当您想重置所有应用程序时,才能执行以下操作。在这项工作之前,请备份您的所有数据库。另外,请注意初始文件中的依赖项(如果有)。

    一次:

    1
    2
    3
    4
    (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]

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

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

    为每个你想要重新参与的应用程序做首字母(3)。请注意,reset(6)将只删除迁移历史记录,因此不会对库造成损害。假迁移(7)将恢复安装的任何第三方应用程序的迁移历史记录。