django 1.7 迁移——如何清除所有迁移并从头开始?
Posted
技术标签:
【中文标题】django 1.7 迁移——如何清除所有迁移并从头开始?【英文标题】:django 1.7 migrations -- how do I clear all migrations and start over from scratch? 【发布时间】:2014-12-04 15:55:19 【问题描述】:因此,我目前正在快速迭代 django 应用程序,并且不断调整 models.py。在一天或两天的编程和测试过程中,我生成了几十个迁移文件。有时我真的把模式拆开并完全重新做。这会导致迁移过程大量抱怨默认值和空值等。如果可能的话,我只是想暂缓所有迁移内容并重新开始迁移,因为我终于知道自己在做什么了。到目前为止,我的方法如下:
-
删除迁移文件夹中除
__init__.py
之外的所有内容。
进入我的 PostgreSQL 控制台并执行:DELETE FROM south_migrationhistory WHERE app_name='my_app';
在 PostgreSQL 控制台中,删除与 my_app 关联的所有表。
重新运行./manage.py makemigrations my_app
- 这会在我的迁移文件夹中生成一个0001_initial.py
文件。
运行./manage migrate my_app
- 我希望此命令能够重新构建我的所有表,但它却显示:“没有要应用的迁移。”
什么给了?
另外,south_migrationhistory
数据库表在我抛弃 South 并切换到 Django 1.7 后是否仍在使用?
谢谢。
【问题讨论】:
请注意,您还可以从 Django(例如 shell)中删除迁移历史记录:from django.db.migrations.recorder import MigrationRecorder; MigrationRecorder.Migration.objects.filter(app=my_app).delete()
重复/相关:How to reset migrations in Django 1.7?
【参考方案1】:
所以我在问题中概述的分步计划确实有效,但我不得不从django_migrations
数据库表中删除行,而不是从south_migrationhistory
数据库表中删除行。
命令是:DELETE FROM django_migrations WHERE app='my_app'
完成此操作后,您将能够从头开始重新运行迁移。
【讨论】:
为了将来参考,我还必须删除应用程序的migrations
文件夹中的所有内容。
@jon 不是说关系已经存在/表已经存在。因为表已经存在并且迁移命令尝试再次创建它们【参考方案2】:
我只是想把所有的步骤变成命令格式:
注意:以下命令具有相当大的破坏性,这是 OP 要求的start from scratch
的一种方式。
在mikeb
发表评论后,我想添加这一行:
PRE - 检查您要删除的文件
find . -path "*migrations*" -name "*.py" -not -path "*__init__*"
然后,将步骤1
中的命令调整为适合您的开发环境的命令。
-
从所有应用中删除所有迁移:
find . -path "*migrations*" -name "*.py" -not -path "*__init__*" -exec rm \; # make sure to be in your projects path
-
重新创建整个数据库:
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
-
让您的数据库保持最新状态:
python3 manage.py makemigrations
python3 manage.py migrate
【讨论】:
注意:您的查找和删除语句可能会比您想要的更多。我只运行了 find ,发现它会删除我的 virtualenv 安装中的 bunch 东西,所以我建议任何阅读本文的人小心这样做。 这是一个很好的笔记,迈克,关于如何使它变得更好的任何建议?我不使用 virtualenv,所以我可以看到为什么*migrations*
可以获取更多。
嗯,使用 virtualenv 你可以调用你的目录任何东西,所以如果你的 virtualenv 安装在 venv
目录中,你可以添加另一个 -not -path "venv/"
或其他东西。也许更简单,而且无需知道您的 virtualenv 目录(或者即使您是否正在使用它),您也可以使用 -maxdepth 2
如果您不想破坏性太大,例如您想减少迁移但不从模型中删除数据,您可以跳过 #2 然后运行 python3 manage.py migrate --fake
来申请迁移而不执行 SQL 命令。以上是关于django 1.7 迁移——如何清除所有迁移并从头开始?的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 1.7 迁移之前运行 South 迁移的推荐方法是啥?
makemigrations 和升级到 Django 1.7 的问题