这与数据库问题有关,类似于在源代码(git)中合并冲突的情况,如果您需要组合两个具有相似模型或在它们之间切换的分支。没有人会故意这样做。
想象一下,您上周开始修改一个应用程序,可能是因为您发现了一个错误或通过添加字段或表来扩展应用程序。今天您收到了更新,但出现了一个问题,因为有一个迁移(migration)正在添加一个字段,而该字段仍然存在于您的数据库中,因此您只能应用该迁移的其他部分。您可以运行以下命令查看迁移的 SQL 内容:
./manage sqlmigrate some_app 0007_new_migration >customized-some_app-0007_new_migration.sql
比较内容与上周所做的更改,并删除或注释掉仍然应用且无法重复的命令。手动运行所有剩余的SQL语句。将此迁移标记为自动应用:
./manage migrate --fake some_app 0007_new_migration
如果你不小心把某些东西破坏了,可能没有人能够帮你,因为迁移系统将不再知道数据库的当前状态。因此,请备份、写下笔记、使用沙盒并且认真工作。
编辑:迁移表django_migrations是所有应用程序中应用的迁移的简单列表。该表中的行应始终与数据库结构同步。可以通过正常的migrate应用迁移(或通过反向迁移应用到较旧的状态来取消应用迁移,但通常会有一些数据丢失)。虚假迁移仅将更改应用于django_migrations表。
me => select * from django_migrations;
id | app | name | applied
----+----------+-------------------------+-------------------------------
1 | some_app | 0001_initial | 2017-10-16 06:11:07.31249+02
2 | some_app | 0002_auto_20171016_1905 | 2017-10-17 02:05:48.979295+02
迁移(文件)是增量变更的描述,也包括了信息,使得可以评估自上一次迁移以来models.py的差异,在运行makemigrations时进行比较。即使最初某些表格未经管理,并且它们稍后可能变为已管理状态,仍然足够记录这些未经管理的表格。
EDIT: 例如:如何使用--fake的sqlmigrate 来通过迁移(重新创建删除的表)修复损坏的数据库。
EDIT: 示例:如果您决定删除某个应用程序的表格并通过migrate来重新创建它们(请注意并查看下面的评论),则可能首先要重置该应用程序的所有迁移,包括初始迁移,使用伪迁移名称“zero”。
./manage migrate --fake some_app zero。
--fake命令时,标记迁移是否已应用是在django_migrations表中定义的。Django在该表中跟踪应用于应用程序的所有迁移,包括迁移文件的名称和应用时间。我花了一些时间才弄清楚这一点,因为文档对此细节并没有明确说明。 - ivanleoncz