摘要
考虑一个具有两个本地数据库配置的项目,称为'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
选项,我该如何解决这个问题?
研究
也许这与自动路由有关...
还有一些类似的问题,但我找不到合适的答案,例如:
1条答案
按热度按时间ni65a41a1#
仍然不确定为什么Django使用错误的数据库引擎来进行问题中提到的特定迁移,尽管使用了
--database=postgresql
选项。然而,出于某种原因,Django似乎决定退回到 default 数据库引擎,它被配置为sqlite3。我们可以通过将
'postgresql'
设置为 default 数据库来解决这个问题: