感谢Dominique Guardiola和hobs的答案,它们帮助我解决了一个难题。不过在解决方案中还存在一些问题,以下是我的看法。
如果你有使用South的第三方应用程序(基本上所有东西都使用South),例如django-cms
,那么使用manage.py reset south
不是一个好主意。
reset south
将删除您安装的所有应用程序的所有迁移历史记录。
现在考虑一下,如果您升级到最新版本的django-cms
,它将包含像0009_do_something.py
这样的新迁移。当您尝试在迁移历史记录中没有0001
到0008
的情况下运行该迁移时,South肯定会感到困惑。
更好/更安全的做法是只有选择性地重置您正在维护的应用程序。
首先,请确保您的应用程序在磁盘上的迁移和已在数据库上执行的迁移之间没有任何不同步。否则会头痛不已。
1. 删除我的应用程序的迁移历史记录
sql> delete from south_migrationhistory where app_name = 'my_app';
2. 删除我的应用程序的迁移
$ rm -rf my_app/migrations/
3. 为我的应用程序创建新的初始迁移
$ ./manage.py schemamigration --initial my_app
4. 模拟执行我的应用程序的初始迁移
这会将迁移插入south_migrationhistory
,而不会触及实际的表:
$ ./manage.py migrate --fake my_app
其实步骤3和4只是manage.py convert_to_south my_app
命令的更长变体,但在修改生产数据库这样微妙的情况下,我更喜欢拥有额外的控制权。
__init__.py
添加到appname/migrations
。 - laike9m./manage.py makemigrations
,但如果您不从新的数据库开始,将会发生糟糕的事情... - Jocelyn delalandesquashmigrations
是正确的答案。 - Julio Marins