Django migrate --fake 和 --fake-initial 解释

2023-11-27

我使用 Django 已经大约两年了,有一个功能我一直害怕使用:伪造迁移.

我几乎到处都查过,我能得到的最多信息来自文档其中指出:

--fake

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

这是为了让高级用户操纵当前 如果他们手动应用更改,则直接迁移状态;是 警告使用 --fake 存在放置迁移状态的风险 表进入需要手动恢复的状态 迁移正确运行。

--假首字母

如果所有数据库都允许 Django 跳过应用程序的初始迁移 包含所有 CreateModel 创建的所有模型名称的表 该迁移中的操作已经存在。该选项的目的是 首次针对数据库运行迁移时使用 迁移的使用是预先存在的。但是,此选项不会检查 用于匹配数据库模式超出匹配表名的范围,所以 仅当您确信现有架构时才可以安全使用 与您初始迁移中记录的内容匹配。

我了解了总体思路以及为什么人们想要使用此功能。但是,我不明白它说的那部分仅适用于高级用户。

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

NOTE

我并不是在寻找伪造迁移时运行的确切原始 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

如果你破坏了某些东西,可能没有人可以帮助你,因为迁移系统不会更多地了解数据库的当前状态。因此,做好备份、写笔记、使用沙箱并精确工作。

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django migrate --fake 和 --fake-initial 解释 的相关文章

随机推荐

  • 如何在docker日志中记录docker healthcheck状态?

    客观的 我想通过验证 docker 日志来检查我的 docker 容器是否健康 要求 I have 两个文件 namely Dockerfile and loop sh我已经向我的泊坞窗添加了 HEALTHCHECK 如下所示 Docker
  • 如何使用 php 将事件插入用户谷歌日历?

    我有以下代码可以插入到我的特定谷歌日历中 嗯 非常成功 但是如何让用户可以添加到自己的日历 有人可以帮助我 我的预期结果就像用户可以通过谷歌登录 这意味着用户可以添加到自己的谷歌日历 谢谢 添加到我的特定日历的代码 require once
  • 为什么 C++ 标准库不提供 cmath 函数的 constexpr 版本?

    We have constexpr自 C 11 以来 函数一直在使用 并且自每个新标准 14 1z 以来 它们的限制越来越少 然而 STL 中最明显的函数可以用constexpr the cmath math h功能 还是没有constex
  • Safari/WebKit 的 console.log DOM 节点作为对象?

    这件事让我抓狂了一段时间 当我 console log 一个 DOM 节点时 通过示例返回document getElementById 它显示为交互式 html 元素 就像它出现在 元素 选项卡上一样 这肯定很方便 但有时我只想能够扩展对
  • 我如何编写正则表达式“所有字符都相同”?

    我希望它匹配 aaaaaa bb c but not aaabaaa cd 假设正则表达式引擎支持反向引用 1 在Java中它会是 theString matches 1
  • 将 Tab 键顺序限制为单个用户控件 (WPF)

    目前我有一个带有自定义 UserControl 的 WPF 项目 该控件包含一个网格 其中包含多个表单类型元素 复选框 文本框 组合框等 该控件被设计为看起来像表单一样操作 但它被放置在拖动画布内 这就是为什么它需要是 UserContro
  • 如何“缓存” mongoDB/Mongoose 结果以在 Express.js 视图和路由中使用

    我想要实现的是某种方式缓存结果 of a mongoDB 猫鼬我可以在我的视图和路线中使用的查询 每当将新文档添加到集合中时 我都需要能够更新此缓存 由于函数是异步的 我不确定这是否可能 如果是 那么如何做到这一点 这是我目前用于存储画廊的
  • 外部链接到 Shiny App 中的特定 tabPanel

    可以相对轻松地在平面闪亮应用程序中使用锚链接 https stackoverflow com a 28605517 1659890 但是 外部链接是否可以针对特定的目标 tabPanel of a navbarPage在闪亮的应用程序中 考
  • Windows Phone 7 Mango 照片相机的取景器方向

    我将 PhotoCamera 控件与 Windows Phone 7 Mango Beta 2 开发工具结合使用 相机控件的 ViewFinder 是一个填充有 VideoBrush 的矩形对象 如下例所示 http msdn micros
  • Python Pandas 使用杰卡德相似度的距离矩阵

    我已经实现了一个使用杰卡德相似度构造距离矩阵的函数 import pandas as pd entries id 1 category1 100 category2 0 category3 100 id 2 category1 100 ca
  • 计算每行零的数量,并删除具有超过 n 个零的行

    我有一个关于计算每行零的问题 我有一个像这样的数据框 a c 1 2 3 4 5 6 0 2 5 b c 0 0 0 2 6 7 0 0 0 c c 0 5 2 7 3 1 0 3 0 d c 1 2 6 3 8 4 0 4 0 e c 0
  • 我迷路了。 ASP.NET MVC 5 发生了什么?

    我一直在埋头从事各种项目 显然微软一直在忙着做出一些重大改变 这让我很困惑 当我去年安装 Visual Studio 2017 并去创建一个新项目时 ASP NET Core 第一次出现在我的视野中 突然我可以选择 NET Framewor
  • flutter 中的闪屏实现

    我是 Flutter 新手 我想在我的应用程序中添加启动画面 我使用了 initState 和导航器 但这没有用 该应用程序打开时会出现初始屏幕 但之后它不会导航到下一个屏幕 我的 main dart import package flut
  • Java:学习基础网络的最佳起点 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在尝试用Java 编写一个简单的网络聊天程序 我几乎没有网络经验 我想知道我应该开始寻找哪些资源 当然除了这里 目前最好坚持使用核心 Java
  • 将文件上传到 S3 时选项请求被拒绝

    当我尝试将 JS 文件上传到 S3 时 出现上传错误 OptionsRequestDenied 除了这个之外 所有其他文件 包括 JS 文件 都可以工作 该文件使用 jQuery 发出一些跨域请求 如下所示 function corsReq
  • NodeJS Electron 与 Express

    我正在尝试使用 Electron 用于网站和桌面应用程序 和 Express 用于会话等 制作一个网络应用程序 现在 我将其作为我的 app js const express require express const app Browse
  • 使用不同的 sqlite 数据库结构将新版本更新到应用程序商店

    我已经在应用程序商店上传了一个应用程序 版本1 0 我的应用程序使用 sqlite 数据库来存储一些数据 现在 我对数据库进行了一些更改 我在数据库的一个表中添加了 2 或 3 个新列 我想用新版本 1 1 更新我的应用程序的先前版本 它具
  • Lambda 表达式未返回预期的 MemberInfo

    我遇到了一个我没有预料到的问题 一个例子可能比一段话更能说明我的问题 更新 跳到最后一个代码块以获得更雄辩的代码示例 public class A public string B get set public class C A 这是方法中
  • 如何在android中单击listview项目时从数据库获取id

    我在此网站上搜索了与此相关的各种问题 但无法解决我遇到的问题 我想通过单击列表视图项从数据库获取 id 这是我的类别类 package com example reminders import java util List import a
  • Django migrate --fake 和 --fake-initial 解释

    我使用 Django 已经大约两年了 有一个功能我一直害怕使用 伪造迁移 我几乎到处都查过 我能得到的最多信息来自文档其中指出 fake 告诉 Django 将迁移标记为已应用或 未应用 但没有实际运行 SQL 来更改您的 数据库架构 这是