技术分享1 分钟阅读
Django 跨数据库迁移实战指南:MySQL 至 PostgreSQL
在 Django 开发中,将数据库从 MySQL 迁移到 PostgreSQL 是常见需求(如为了使用 PG 的 JSONB 性能或 Serverless 优势)。本文提供一套标准的无损迁移流程。
核心流程图
•
源库导出 (MySQL) -> 2. 编码修复 -> 3. 目标库建表 (PG) -> 4. 数据导入 -> 5. 序列重置
第一阶段:从源库(MySQL)导出数据
在导出时,最容易遇到的问题是 Windows 环境下的 编码错误 (UTF-8)。
1. 设置环境编码
在 PowerShell 中强制 Python 使用 UTF-8 模式,防止中文乱码:
$env:PYTHONUTF8 = 12. 导出 JSON 文件
使用 -o 参数而非重定向符号 >,确保 Django 内部处理编码:
python manage.py dumpdata -o data.json第二阶段:目标数据库(PostgreSQL/Neon)配置
1. 修改 settings.py
PostgreSQL(尤其是云服务如 Neon)强制要求 SSL 连接:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'neondb', # 确认 Neon 上的 DB 名字
'USER': 'neondb_owner',
'PASSWORD': '你的密码',
'HOST': 'ep-xxxx.aws.neon.tech',
'PORT': '5432',
'OPTIONS': {
'sslmode': 'require', # Neon 必须要求 SSL
},
}
}2. 创建表结构
在导入数据前,目标库必须有表结构,但必须是空表:
python manage.py migrate第三阶段:数据导入(避坑指南)
1. 排除系统冲突数据
migrate 命令会自动生成基础权限和类型数据,如果 data.json 里也包含这些,会导致主键冲突。必须排除:
python manage.py loaddata data.json --exclude contenttypes --exclude auth.Permission注意:如果依然报错 UnicodeDecodeError,说明导出的文件编码仍有问题,需通过 VS Code 将 data.json 重新保存为 UTF-8 编码。
第四阶段:同步后修复(关键步骤)
这是最容易被遗忘的一步。PostgreSQL 使用 SEQUENCE 管理自增 ID。手动导入 ID 后,计数器不会自动更新。
1. 生成序列重置 SQL
# apitest 是你的 App 名称
python manage.py sqlsequencereset apitest auth2. 执行修复
将上述命令生成的 SELECT setval(...) 语句全部复制,在数据库管理工具(DBeaver/Navicat/Neon Console)的 SQL 窗口执行。
如果不执行此步: 你在网页上新增任何数据都会报 Duplicate Key 错误。
常见问题总结(Lessons Learned)
[table]
验证清单
执行完 loaddata 提示 Installed xxx object(s)。
执行完 sqlsequencereset 生成的 SQL 并在数据库中运行。
启动服务后,能在页面看到旧数据。
点击“新增”按钮,能成功创建一条新数据(证明序列修复成功)。
有关使用上的问题,欢迎您在底部评论区留言,一起交流~
读者评论
评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。
暂无评论,欢迎抢沙发。