执行Django migrate指定PostgreSQL时突然切换至SQLite报错
问题排查与解决方案
核心原因
自定义数据迁移myapp.0002_copy_data_from_mymodel中的查询/操作未明确指定使用postgresql数据库连接,Django自动 fallback 到默认的SQLite配置,而SQLite中不存在目标表,因此触发报错。
具体修复步骤
1. 修正自定义迁移的数据库指定
打开myapp/migrations/0002_copy_data_from_mymodel.py,针对不同场景调整代码:
- ORM查询场景:给ORM操作添加
using()方法指定目标数据库# 原错误写法 MyModel.objects.all() # 修改后写法 MyModel.objects.using('postgresql').all() - RunPython操作场景:给
RunPython传入using参数,并通过schema_editor绑定指定连接# 在Migration类的operations中指定using operations = [ migrations.RunPython(copy_data_func, using='postgresql'), ] # 迁移函数中使用schema_editor的连接 def copy_data_func(apps, schema_editor): MyModel = apps.get_model('myapp', 'MyModel') # 用schema_editor确保连接指向postgresql with schema_editor.connection.cursor() as cursor: cursor.execute("SELECT * FROM myapp_mymodel")
2. 检查迁移依赖的外部代码
如果迁移中调用了外部工具函数(比如从myapp.utils导入的处理函数),要确保这些函数支持指定数据库别名:
# 工具函数修改示例 def process_mymodel_data(using='default'): return MyModel.objects.using(using).filter(status='active')
在迁移函数中调用时传入using='postgresql'参数。
3. 验证PostgreSQL的迁移状态
连接本地PostgreSQL数据库,确认myapp的初始迁移已被正确标记为应用:
SELECT * FROM django_migrations WHERE app = 'myapp' AND name = '0001_initial';
如果无对应记录,先手动补执行初始迁移:
python manage.py migrate myapp 0001_initial --database=postgresql
4. 重新执行迁移
完成上述修复后,重新执行指定数据库的迁移命令:
python manage.py migrate --database=postgresql
内容的提问来源于stack exchange,提问作者djvg
相关产品推荐
相关产品推荐

