我已经使用Django大约两年了,我一直不敢使用的功能是:伪造迁移。
我到处都看了很多,我可以从documentation那里获得最多的信息,该信息指出:
-假
-假初始
我得到了一般的想法,以及为什么要使用此功能。但是,我不明白它说仅用于高级用户的部分。
有人可以解释一下幕后发生的事情以及为什么需要手动恢复。
注意
我不是在寻找伪造迁移时运行的确切原始SQL查询。我只是在寻找幕后发生的一般情况,也许是为什么伪造移民的一个例子
会导致makemigrations
无法正常工作的状态。
最佳答案
如果您需要将两个具有相似模型的分支合并或在它们之间进行切换,则这与数据库问题类似,类似于源代码(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
如果您破坏了某些内容,那么没人会帮助您,因为迁移系统将无法进一步了解数据库的当前状态。因此,请进行备份,写笔记,使用沙盒并精确地工作。编辑:迁移表
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
时进行比较。在某些表最初未被管理并且以后可以被管理的情况下也足够了。 (因此也记录了非托管表。)编辑:一个示例:如何将带有
sqlmigrate
的--fake
用于fix a broken database by migrations(重新创建已删除的表)。编辑:示例:如果您决定删除某个应用程序的表并通过
migrate
重新创建它们(请注意,请在下面查看我的评论),您可能还想先重置该应用程序的所有迁移,包括初始迁移,通过伪迁移名称“零”。./manage migrate --fake some_app zero
。关于django - Django的--fake和--fake-initial解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46772762/