sqlite Django migrate在某些迁移中使用了错误的数据库后端

xtupzzrd  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(144)

摘要

考虑一个具有两个本地数据库配置的项目,称为'sqlite'(默认)和'postgresql'。运行migrate --database=postgresql成功地将前几次迁移迁移到postgresql,然后突然开始使用错误的数据库后端,导致以下错误:

sqlite3.OperationalError: no such table: myapp_mymodel

后台

在一个遗留的Django 3.2项目上工作,总共有超过10个应用程序和超过200个迁移。该项目配置为在生产中使用PostgreSQL,但使用SQLite进行 * 本地 * 测试。
现在,为了保持一致性,我想将项目配置为也使用PostgreSQL * 本地 *,而不是SQLite。
所以我是这么做的

  • 我在本地开发系统上创建了一个全新的PostgreSQL数据库,配置为Django
  • 除了'default' SQLite配置之外,我还在本地设置文件中添加了一个名为'postgresql'的数据库配置(参见下面的示例)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        ...,
    },
    'postgresql': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        ...,
    },
}
  • 测试并验证了数据库和相应的Django配置
  • 运行python manage.py migrate --database=postgresql

这就是事情出错的地方。

问题

前一百个迁移(大约)被正确地应用,但随后Django遇到了一个错误:

Running migrations:
  Applying myapp.0002_copy_data_from_mymodel...python-BaseException
Traceback (most recent call last):
   ...
sqlite3.OperationalError: no such table: myapp_mymodel
...
File "/home/dev/Documents/my_project/venv/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 423, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: myapp_mymodel

显然,出于某种原因,Django突然开始使用sqlite3后端,而不是postgresql后端。
我确认了成功的迁移确实应用到了postgresql数据库,使用了python manage.py showmigrations --database=postgresql,并在psql中列出了表。表myapp_mymodel确实存在于PostgreSQL数据库中。
我还检查了违规迁移(自定义数据迁移)及其依赖项,但没有发现任何异常。其他类似的数据迁移也顺利应用。

提问

为什么Django突然切换到sqlite数据库后端,尽管使用了--database=postgresql选项,我该如何解决这个问题?
研究
也许这与自动路由有关...
还有一些类似的问题,但我找不到合适的答案,例如:

ni65a41a

ni65a41a1#

仍然不确定为什么Django使用错误的数据库引擎来进行问题中提到的特定迁移,尽管使用了--database=postgresql选项。然而,出于某种原因,Django似乎决定退回到 default 数据库引擎,它被配置为sqlite3。
我们可以通过将'postgresql'设置为 default 数据库来解决这个问题:

DATABASES = {
    'sqlite': {
        'ENGINE': 'django.db.backends.sqlite3',
        ...,
    },
    'postgresql': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        ...,
    },
}
DATABASES['default'] = DATABASES['postgresql']

相关问题