Notion Blog
技术分享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 = 1

2. 导出 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 auth

2. 执行修复

将上述命令生成的 SELECT setval(...) 语句全部复制,在数据库管理工具(DBeaver/Navicat/Neon Console)的 SQL 窗口执行

如果不执行此步: 你在网页上新增任何数据都会报 Duplicate Key 错误。


常见问题总结(Lessons Learned)

[table]


验证清单

执行完 loaddata 提示 Installed xxx object(s)。

执行完 sqlsequencereset 生成的 SQL 并在数据库中运行。

启动服务后,能在页面看到旧数据。

点击“新增”按钮,能成功创建一条新数据(证明序列修复成功)。


有关使用上的问题,欢迎您在底部评论区留言,一起交流~

读者评论

评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。