当前位置: 首页 > 面试题库 >

Django的--fake和--fake-initial解释

周浩淼
2023-03-14
问题内容

我已经使用Django大约2年了,我一直害怕使用的一个功能:伪造迁移。

我到处都看了很多,我能获得的最多信息是从文档中获得的,该文档指出:

– fake

告诉Django将迁移标记为已应用或未应用,但没有实际运行SQL来更改数据库架构。

如果高级用户手动应用更改,则可以直接操作当前迁移状态。请注意,使用–fake冒着将迁移状态表置于需要手动恢复以使迁移正确运行的状态的风险。

–fake-initial

如果使用该迁移中所有CreateModel操作创建的所有模型的所有数据库表均已存在,则允许Django跳过应用程序的初始迁移。此选项适用于首次对已预先使用迁移的数据库运行迁移时使用。但是,此选项不会检查匹配表名称之外的匹配数据库架构,因此只有在确信现有架构与初始迁移中记录的内容相匹配时,才可以安全使用。

我得到了一般的想法,以及为什么要使用此功能。但是,我不明白它所说的部分仅适用于高级用户。

有人可以解释一下幕后发生的事情以及为什么需要手动恢复。

注意

我不是在寻找伪造迁移时运行的确切原始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可以通过迁移来修复损坏的数据库(重新创建已删除的表)。

编辑:示例:如果你决定删除某个应用程序的表,然后通过创建它们migrate,你可能还想通过伪迁移名称“ 零 ” 首先重置该应用程序的所有迁移,包括初始迁移。
./manage migrate –fake some_app zero。



 类似资料:
  • "FAKE - F# Make" 是一个跨平台的构建自动化系统。由于它与F#集成,因此可以使用.NET Framework和函数式编程的所有优点,包括扩展的类库,强大的调试器和集成的开发环境(如Visual Studio或MonoDevelop),它们提供语法突出显示和代码完成功能。 简单示例 #r "tools/FAKE/tools/FakeLib.dll" // include Fake li

  • Fake-server 是一个模拟服务器响应的工具,具有通用性和非侵入性。它被用来解决测试过程中服务器加载缓慢或者是不能运行的问题。其理念是创建一个网络服务器来监听不同端口,并针对每个不同的请求进行不同的配置。这里的"配置"是指某些参数(posting the parameters)和服务器作出的响应。 它的优点: 不需要代码说明 (as long as the external server e

  • Fake Terminal Website (FTW) A fully customizable terminal-like-website Preview You can preview a live demo here with a raw FTW template or my personal website that also uses this template. Desktop Mob

  • homebridge-fake-rgb An homebridge plugin that create an Fake RGB Bulb HomeKit accessory Installation Follow the instruction in homebridge for the homebridge server installation. The plugin is publishe

  • 我们正在GKE上的k8s集群上运行一个应用程序。 我们正在使用一个nginx入口控制器作为外部负载平衡器服务,比如说,https://12.345.67.98 . 我们面临的一个问题是,当我们直接访问上述URL上的负载平衡器时,我们会收到一个证书警告,因为使用了自签名的“Kubernetes入口控制器假证书”。 我们只有将我们的域(例如app.our company.com)映射到Kubernet

  • 我尝试为UWP客户端做单元测试REST通信逻辑。关于System.Web.HttpClient的答案,我发现Windows.net.HttpClient也接受一个名为的论点。 因此,我尝试使用做出自定义响应,但我不知道做出响应的正确方法。 请注意,这不是与mocking/faking相关的重复问题。我所要求的是。我没能用它实现。 注意,是内部可访问的,是密封的。很难模仿或继承并重写它。