django迁移地狱,丢了一张桌子。试图找回它

Posted

技术标签:

【中文标题】django迁移地狱,丢了一张桌子。试图找回它【英文标题】:django migration hell, dropped a table. Tried to get it back 【发布时间】:2017-06-04 11:36:29 【问题描述】:

所以我在我的数据库中删除了一个表,我想要它回来。重新运行迁移给出了错误表不存在。经过一番打猎后,我了解到我可以删除 django_migrations 中应用程序名称为我的应用程序的所有内容。所以我这样做了,重新运行它开始工作的迁移,然后抱怨没有删除的表。

我不知道如何才能重新获得一张桌子并保持一切原样......无论如何要这样做?

我不关心数据库中 90% 的数据,只关心几个表和字段。我删除的表我不关心数据。

【问题讨论】:

【参考方案1】:

您可以使用sqlmigrate 命令打印 Django 将执行的 SQL 命令。然后,您可以选择重新创建已删除的表所需的命令并手动应用它们。

一旦所有表都重新就位,您可以使用migrate <app_name> --fake 转发迁移历史记录,因此 Django 知道应用了此应用中的迁移。

【讨论】:

运行了这个 django-admin sqlmigrate swsite mymigration 它给出了一个错误:django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE,但未配置设置。您必须在访问设置之前定义环境变量 DJANGO_SETTINGS_MODULE 或调用 settings.configure()。叹。这一切都是因为 postgres 存在时区问题。 运行python manage.py sqlmigrate。你可以使用django-admin,但是你需要显式配置设置模块。 该命令表示参数不足。它想要更像应用程序名称和迁移名称,我想我可以单独运行它们?【参考方案2】:

首先检查django_migrations 表。它包含有关哪些迁移已运行的数据。将此数据与实际迁移文件进行比较,以了解哪些已运行或未运行。

最后,不要害怕删除 django_migrations 中的行并修改您的原始迁移文件以重新创建您需要的表。

【讨论】:

如果我手动运行迁移文件中的依赖关系,我可以删除它们吗? 是的,只要你的迁移最终是幂等的(你可以继续运行它们并且没有任何改变),你就可以了。

以上是关于django迁移地狱,丢了一张桌子。试图找回它的主要内容,如果未能解决你的问题,请参考以下文章

关于Django中的迁移文件

清空桌子并装满固定装置

不知道为啥 django South 试图运行反向迁移

我不小心删除了 Django 中的迁移文件夹

修改 Django 迁移文件,或使用 --fake 标志?

Django 迁移值无效文字