如果您需要合并两个具有相似模型的分支或在它们之间进行切换,则与源代码(git)中的合并冲突类似的数据库问题有关。没有人故意喜欢它。
想象一下,您上周开始修改一个应用程序,可能是因为您发现了一个错误,或者您通过字段或表扩展了应用程序。今天您收到了更新,但遇到了问题,因为有一个迁移添加了仍在数据库中的字段,并且您只能应用该迁移的其他部分。您可以通过运行来查看迁移的 SQL 内容
./manage sqlmigrate some_app 0007_new_migration >customized-some_app-0007_new_migration.sql
将内容与上周所做的更改进行比较,并删除或注释掉仍然应用且无法重复的命令。手动运行所有剩余的 SQL。将迁移标记为自动应用:
./manage migrate --fake some_app 0007_new_migration
如果你破坏了某些东西,可能没有人可以帮助你,因为迁移系统不会更多地了解数据库的当前状态。因此,做好备份、写笔记、使用沙箱并精确工作。
EDIT:迁移表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:一个例子:如何sqlmigrate
with --fake
可以用来通过迁移修复损坏的数据库(重新创建已删除的表)。
EDIT:示例:如果您决定删除某个应用程序的表并通过以下方式重新创建它们migrate
(请注意,请参阅下面的评论),您可能还想首先通过伪迁移名称重置该应用程序的所有迁移,包括初始迁移”zero".
./manage migrate --fake some_app zero
.