部署在AWS Elastic Beanstalk的Django应用无法写入PostgreSQL数据库
Django应用从MySQL迁移PostgreSQL后写入报错的解决方法
场景与迁移步骤
部署在AWS Elastic Beanstalk上的Django应用,原本连接MySQL RDS实例,按以下步骤迁移至PostgreSQL RDS:
- 连接PostgreSQL实例,执行
python manage.py migrate - 执行
python manage.py sqlflush,并运行生成的SQL命令 - 从MySQL导出contenttypes的JSON fixture:
再导入PostgreSQL:python manage.py dumpdata contenttypes --indent=4 --natural-foreign > contenttype.json
此步骤保留了主键(PK)和外键(FK)关联python manage.py loaddata contenttype.json - 使用AWS DMS完成MySQL到PostgreSQL的数据迁移
问题现象
- Django应用(如后台管理)可正常读取PostgreSQL中的数据,但尝试写入时触发500错误
- 排除AWS安全配置问题(能读取但无法写入不符合权限限制的特征)
- 使用相同连接参数通过pgAdmin 4连接数据库时,执行INSERT语句必须显式指定主键值才能成功写入
问题根源与解决方法
问题出在PostgreSQL的主键序列上:迁移后多张表的主键序列当前值被重置为1,当Django尝试自动生成主键时,会与已存在的主键值冲突,导致写入失败。
解决方法是找到各表ID(主键)的最大值,更新对应序列的当前值,让序列从最大值+1的位置开始生成新主键。具体可通过PostgreSQL语句批量或逐个更新序列,确保序列值始终大于现有主键的最大值。
内容的提问来源于stack exchange,提问作者Oliver Burdekin
相关产品推荐
相关产品推荐

