You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:12:37