password
查看人数
type
Post
status
Published
date
Feb 5, 2026 11:52
slug
974ee09a-b89d-4efb-89ec-95fce8cf7dcc
summary
category
技术分享
icon
tags
django
作者
状态
待发布
在 Django 开发中,将数据库从 MySQL 迁移到 PostgreSQL 是常见需求(如为了使用 PG 的 JSONB 性能或 Serverless 优势)。本文提供一套标准的无损迁移流程。
核心流程图
- 源库导出 (MySQL) -> 2. 编码修复 -> 3. 目标库建表 (PG) -> 4. 数据导入 -> 5. 序列重置
第一阶段:从源库(MySQL)导出数据
在导出时,最容易遇到的问题是 Windows 环境下的 编码错误 (UTF-8)。
1. 设置环境编码
在 PowerShell 中强制 Python 使用 UTF-8 模式,防止中文乱码:
2. 导出 JSON 文件
使用 -o 参数而非重定向符号 >,确保 Django 内部处理编码:
第二阶段:目标数据库(PostgreSQL/Neon)配置
1. 修改 settings.py
PostgreSQL(尤其是云服务如 Neon)强制要求 SSL 连接:
2. 创建表结构
在导入数据前,目标库必须有表结构,但必须是空表:
第三阶段:数据导入(避坑指南)
1. 排除系统冲突数据
migrate 命令会自动生成基础权限和类型数据,如果 data.json 里也包含这些,会导致主键冲突。必须排除:
- 注意:如果依然报错 UnicodeDecodeError,说明导出的文件编码仍有问题,需通过 VS Code 将 data.json 重新保存为 UTF-8 编码。
第四阶段:同步后修复(关键步骤)
这是最容易被遗忘的一步。PostgreSQL 使用 SEQUENCE 管理自增 ID。手动导入 ID 后,计数器不会自动更新。
1. 生成序列重置 SQL
2. 执行修复
将上述命令生成的 SELECT setval(...) 语句全部复制,在数据库管理工具(DBeaver/Navicat/Neon Console)的 SQL 窗口执行。
如果不执行此步: 你在网页上新增任何数据都会报 Duplicate Key 错误。
常见问题总结(Lessons Learned)
报错信息 | 原因 | 解决方法 |
UnicodeDecodeError: 'utf-8' byte 0xb5... | Windows 默认编码不是 UTF-8 | 设置 $env:PYTHONUTF8 = 1 重新导出,或用 VS Code 转码 |
relation "auth_user" does not exist | 目标库没建表 | 先执行 python manage.py migrate |
database "xxx" does not exist | 配置的 NAME 与云端不符 | 去 Neon 控制台确认 Database 名字(默认为 neondb) |
SSL connection is insecure | 缺少 SSL 配置 | 在 OPTIONS 中加入 'sslmode': 'require' |
IntegrityError: (1, ...) | 权限数据冲突 | 使用 --exclude contenttypes --exclude auth.Permission |
验证清单
执行完 loaddata 提示 Installed xxx object(s)。
执行完 sqlsequencereset 生成的 SQL 并在数据库中运行。
启动服务后,能在页面看到旧数据。
点击“新增”按钮,能成功创建一条新数据(证明序列修复成功)。
有关使用上的问题,欢迎您在底部评论区留言,一起交流~
- 作者:躁静有徒
- 链接:https://zaojingyoutu.top//article/974ee09a-b89d-4efb-89ec-95fce8cf7dcc
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章