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
相关产品推荐
相关产品推荐

