44

所以我现在正在快速迭代一个 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,那么数据库表还在使用吗?

谢谢。

4

2 回答 2

36

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

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

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

于 2014-10-09T16:17:36.483 回答
23

我只是想把所有的步骤变成一个命令格式:

注意:start from scratch下面的命令非常具有破坏性,这是OP 要求的一种手段。

在发表评论后,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
  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
于 2015-05-03T16:35:56.380 回答