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 迁移的推荐方法是啥?

Django 1.7 迁移不会重新创建删除的表,为啥?

Django 1.7 内置迁移与南迁移?

makemigrations 和升级到 Django 1.7 的问题

在迁移中获取模型 ContentType - Django 1.7

从 South 迁移到 Django 1.7 迁移:可交换依赖项