django 1.7迁移 - 如何清除所有迁移并从头开始?

jon*_*omo 39 django database-migration django-south django-1.7 django-migrations

所以我现在正在快速迭代一个django应用程序,我不断调整models.py.在一两天的编程和测试过程中,我生成了几十个迁移文件.有时候我真的撕开了架构并完全重新做了.这会导致迁移过程对默认值和空值等抱怨很多.如果可能的话,我只想抓住所有迁移的东西并重新开始迁移,因为我终于知道我在做什么了.到目前为止,我的方法如下:

  1. 删除迁移文件夹中除了的所有内容__init__.py.
  2. 放入我的PostgreSQL控制台并执行: DELETE FROM south_migrationhistory WHERE app_name='my_app';
  3. 在PostgreSQL控制台上,删除与my_app关联的所有表.
  4. 重新运行./manage.py makemigrations my_app- 这会0001_initial.py在我的迁移文件夹中生成一个文件.
  5. run ./manage migrate my_app- 我希望这个命令重新构建我的所有表,但是它说:"没有要应用的迁移."

是什么赋予了?

此外,south_migrationhistory数据库表现在仍然在播放,我已经转向南并已切换到Django 1.7?

谢谢.

jon*_*omo 34

因此,我在问题中概述的分步计划确实有效,但south_migrationhistory我不得不从数据库表中删除行,而是从数据库表中删除行django_migrations.

命令是: DELETE FROM django_migrations WHERE app='my_app'

完成此操作后,您将能够从头开始重新运行迁移.

  • @jon 不是说关系已经存在/表已经存在。因为表已经存在并且 migrate 命令尝试再次创建它们 (2认同)

mim*_*lea 20

我只想将所有步骤放入命令格式:

注意:下面的命令非常具有破坏性,它是start from scratchOP所要求的手段.

mikeb我发表评论后,我想添加这一行:

预先检查您要删除的文件

find . -path *migrations* -name "*.py" -not -path "*__init__*"

然后,将步骤中的命令调整为1适用于您的开发环境的命令.

  1. 从所有应用中删除所有迁移:
find . -path *migrations* -name "*.py" -not -path "*__init__*" -exec rm {} \; # make sure to be in your projects path
Run Code Online (Sandbox Code Playgroud)
  1. 重新创建整个数据库:
sudo -u postgres bash -c "psql -c \"DROP DATABASE rootedin;\""
sudo -u postgres bash -c "psql -c \"CREATE DATABASE rootedin;\""
sudo -u postgres bash -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE rootedin to vagrant;\"" # vagrant is my current user
Run Code Online (Sandbox Code Playgroud)
  1. 让你的数据库更新:
python3 manage.py makemigrations
python3 manage.py migrate
Run Code Online (Sandbox Code Playgroud)

  • 注意:您的查找和删除语句可能会删除超出您想要的方式.我只是运行了发现并发现它在我的virtualenv安装中删除了一堆*的东西,所以我建议任何阅读此内容的人要小心这样做. (4认同)
  • 如果你不想那么具有破坏性,比如说你想减少你的迁移而不是从你的模型中删除数据,你可以跳过#2然后运行`python3 manage.py migrate --fake`来应用迁移而不执行SQL命令. (3认同)