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

问题描述 投票:0回答:1

总结

考虑一个具有两个本地数据库配置的项目,称为

'sqlite'
(默认)和
'postgresql'
。运行
migrate --database=postgresql
成功地将前几次迁移迁移到 postgresql,然后突然开始使用错误的数据库后端,导致以下错误:

sqlite3.OperationalError: no such table: myapp_mymodel

背景

正在开发一个旧版 Django 3.2 项目,该项目包含十多个应用程序和总共超过 200 个迁移。该项目配置为在生产中使用 PostgreSQL,但使用 SQLite 进行本地测试。

现在,为了保持一致性,我想将项目配置为在本地使用 PostgreSQL,而不是 SQLite。

所以,这就是我所做的:

  • 在本地开发系统上创建了一个全新的 PostgreSQL 数据库,为 Django 配置

  • 在本地设置文件中添加了一个名为

    'postgresql'

     的数据库配置,
    除了 'default' SQLite 配置(参见下面的示例)
    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 后端。

我使用 

python manage.py showmigrations --database=postgresql

并通过在

psql
中列出表来确认成功的迁移确实应用于 postgresql 数据库。表
myapp_mymodel
确实存在于 PostgreSQL 数据库中。
我还检查了有问题的迁移(自定义数据迁移)及其依赖项,但没有看到任何异常情况。应用其他类似的数据迁移没有出现问题。

问题

为什么 Django 突然切换到 sqlite 数据库后端,尽管使用了

--database=postgresql

选项,我该如何解决这个问题?

研究

也许这与

自动路由

有关... 还有一些类似的问题,但我在那里找不到合适的答案,例如:

    Django 项目使用错误的(旧)数据库设置
python django postgresql sqlite database-migration
1个回答
0
投票
--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']

© www.soinside.com 2019 - 2024. All rights reserved.