【问题标题】:django 1.7 migrations -- how do I clear all migrations and start over from scratch?django 1.7 迁移——如何清除所有迁移并从头开始?
【发布时间】:2014-12-04 15:55:19
【问题描述】:

因此,我目前正在快速迭代 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. 运行./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()

标签: django database-migration django-south django-1.7 django-migrations


【解决方案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 中的命令调整为适合您的开发环境的命令。

  1. 从所有应用中删除所有迁移:
find . -path "*migrations*" -name "*.py" -not -path "*__init__*" -exec rm {} \; # make sure to be in your projects path
  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
  1. 让您的数据库保持最新状态:
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 命令。
猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 2014-12-13
  • 2015-06-27
  • 1970-01-01
  • 2014-12-21
  • 2014-10-28
  • 2015-10-31
  • 2014-05-28
相关资源
最近更新 更多