Django迁移错误地应用

Posted

技术标签:

【中文标题】Django迁移错误地应用【英文标题】:Django migrations wrongly applying 【发布时间】:2021-02-06 23:31:45 【问题描述】:

基本问题

我正在开发一个 django 项目,我在其中使用多个数据库和一个自定义路由器。 因此,django 应该知道哪个数据库用于哪个应用程序。

现在我遇到了一些我认为奇怪的行为,并想问是否有人知道这是否是正确的行为,特别是因为 github page 似乎没有问题跟踪器。

为了说明这一点,我使用了一个极端的例子,但我还是尝试了。出于测试目的,我将allow_migrate 函数设置为只返回False。 我确实创建了一个自定义路由器,它覆盖了allow_migrate 函数,我还在DATABASE_ROUTERS 设置下注册了它。 allow_migrate 函数也被调用,因为我用一些 print 语句检查了它。

我如何理解路由器的使用情况

按照我对using multiple databases with a custom router 文档的理解,allow_migration 方法指定是否要对当前的dbapp_labelmodel_name 应用迁移。 如果返回True,则应用迁移,如果返回False,则“静默跳过”,因此不应用。

我的预期

由于我一直将allow_migrate 函数设置为返回False,因此我预计不会应用任何尚未应用的迁移。

实际发生的情况

正如文档所述,迁移确实“默默地跳过”,但表 django_migrations 仍然填充了尚未应用的迁移。

为什么这是个问题

因此,如果我在 allow_migrate 函数中有实际逻辑,即使未正确应用迁移,例如因为该数据库正在针对不应存储在该数据库中的特定应用程序进行测试,所以该数据库的django_migrations 表正在填充错误数据。

那么,这是想要的行为吗?我只是使用函数allow_migrate 错误,实际上应该使用其他东西吗?

如果相关,我使用django version 3.1.2,我的数据库是mariadb 数据库。

【问题讨论】:

【参考方案1】:

我有点明白所描述的问题是如何真正需要的。

似乎对于django 知道的每个数据库,它都将使用makemigrations 创建的迁移写入django_migrations 表,即使它实际上并未应用迁移。 因此,它会跟踪每次新创建的迁移,并且只考虑未存储在django_migrations 表中的迁移。

再次说明:在任何情况下,无论是否应用迁移,都会将其写入django_migrations 表中。是否实际应用迁移仅由我提到的allow_migrate 函数决定。但是,除了查看该数据库中已更改的表之外,没有任何线索是否确实应用了迁移。

我建议,django 应该在控制台中这样说,或者只是在django_migrations 中添加一个字段applied。也许我会为此准备一个拉取请求。

【讨论】:

以上是关于Django迁移错误地应用的主要内容,如果未能解决你的问题,请参考以下文章

django - 迁移和模型翻译的麻烦

陷入 django 南迁移 - TransactionManagement 错误

SQLite 工作,但 PostgreSQL 迁移数据库导致错误 - Django 3.0

南迁移错误:django.contrib.auth 的 NoMigrations 异常

Django 迁移错误:错误:“选择”必须是可迭代的(例如,列表或元组)

Django 迁移错误:字段“名称”没有默认值