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

Django从SQLite迁移至PostgreSQL后无法读取已有表数据如何解决

问题根因

你现在拿不到数据本质是两个核心问题没处理对:

  • 之前执行migrate只在PostgreSQL里创建了空的表结构,原SQLite里存储的业务数据根本没导入进来,不管是dumpdata还是ORM查询当然拿不到业务内容
  • 你写的Cruises模型Django默认会映射到<app名称>_cruises表,和你提到的已有业务表item名称完全对不上,就算表里面有数据,ORM也查错了位置。
分步解决流程

第一步:从原SQLite库导出全量有效数据

先把settings.py里的数据库配置临时切回原来的SQLite,确保路径指向你迁移前正常使用的sqlite.db文件,执行下面的命令导出数据,排除掉不需要重复导入的系统表数据,避免后续导数据时出现主键冲突:

python manage.py dumpdata --exclude auth.permission --exclude contenttypes --exclude admin.logentry --exclude sessions.session > db_data.json

导出完成后打开生成的db_data.json扫一眼,确认能看到业务表对应的条目再往下走,别导了空文件白忙活。

第二步:修正模型和业务表的映射关系

既然你要读取的已有业务表名叫item,必须在模型里显式指定表名,不然Django默认匹配的表名根本不对。修改models.py里的Cruises类,添加内部Meta类指定表名,同时核对模型字段和item表里的字段完全对应:

from django.db import models

class Cruises(models.Model):
    title = models.CharField(max_length=200)
    #ship_name = models.CharField(blank=True, null=True,max_length = 200)

    class Meta:
        db_table = 'item'  # 直接对接已有的item业务表

    def __str__(self):
        return self.title

改完把数据库配置切回PostgreSQL,先不要执行migrate,直接连PostgreSQL核对item表结构:确认存在主键id字段,title字段是字符类型、长度不小于200,字段对不上就手动调整表结构或者修改模型字段做匹配。

第三步:导入数据到PostgreSQL

保持PostgreSQL的数据库配置生效,执行数据导入命令:

python manage.py loaddata db_data.json

如果导入过程报主键冲突错误,就先清空PostgreSQL里所有表的现有测试数据,再重新执行导入命令。

第四步:验证数据查询是否正常

导入完成后先不用开浏览器看页面,先进Django shell测试查询逻辑:

python manage.py shell
>>> from cruise_control.models import Cruises
>>> Cruises.objects.count()

如果返回的条数和你之前SQLite里存储的业务数据条数一致,就说明数据已经正常导入,刷新页面就能看到下拉框里的选项了。

额外排查点

如果做完以上步骤页面还是不显示数据,按顺序排查:

  • 直接用psql或其他数据库客户端连PostgreSQL查询item表,确认数据确实已经导入到表内
  • 检查数据库配置里填写的user账号,是否拥有scraper库下item表的查询权限
  • 现有模板的循环写法没有问题,values('title')返回的字典用lng_l.title可以正常取值,不需要修改模板代码

内容的提问来源于stack exchange,提问作者tesla john

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:54:20