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 优势)。本文提供一套标准的无损迁移流程。

核心流程图

  1. 源库导出 (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 并在数据库中运行。
启动服务后,能在页面看到旧数据。
点击“新增”按钮,能成功创建一条新数据(证明序列修复成功)。

 
 
💡
有关使用上的问题,欢迎您在底部评论区留言,一起交流~
tailscale aidlux 实现异地组网
Loading...