# DjangoAdmin 数据库迁移工具 - 完整总结 ## 🎯 核心功能 支持将 DjangoAdmin 项目的所有数据从 MySQL 迁移到 PostgreSQL、SQL Server、SQLite、Oracle 等数据库。 **迁移范围:35张表** - Django内置表(11张):auth_permission, auth_group, auth_user, auth_group_permissions, auth_user_groups, auth_user_user_permissions, django_content_type, django_migrations, django_session, django_admin_log, captcha_captchastore - 项目业务表(24张):django_dept, django_menu, django_role, django_user, django_city 等 ## ✅ 成功验证 ``` [迁移开始] 源: mysql:djangoadmin.django.elevue → 目标: postgresql:djangoadmin.django.elevue [迁移开始] 待迁移 35 张表 [✓] [1/5] 建目标库 完成(耗时 62ms) [✓] [2/5] 建表结构(35 张表 create_all) 完成(耗时 74ms) [✓] [3/5] 逐表迁移数据 完成(耗时 37.5s),共 784612 行 [✓] [4/5] 重置自增序列 完成(耗时 2.2s) [✓] [5/5] 逐表行数校验 完成(耗时 605ms),35 张表全部 PASS [迁移完成] 成功:784612 行 / 35 张表 / 总耗时 40.8s ``` ## 📁 文件清单 | 文件 | 说明 | 大小 | |------|------|------| | `migrate_db.py` | 主迁移脚本 | 30KB | | `README.md` | 快速入门指南 | 3KB | | `MIGRATE_README.md` | 详细使用说明 | 10KB | | `CHANGELOG_MIGRATE.md` | 变更说明 | 5KB | | `migrate_quick_ref.sh` | 快速参考脚本 | 4KB | ## 🚀 快速使用 ### 1. 首次迁移(目标库为空) ```bash python scripts/migrate_db.py \ --src-driver=mysql --src-host=127.0.0.1 --src-port=3306 \ --src-db=djangoadmin.django.elevue --src-user=root --src-pass=root \ --dst-driver=postgresql --dst-host=127.0.0.1 --dst-port=5432 \ --dst-db=djangoadmin.django.elevue --dst-user=postgres --dst-pass=postgres ``` ### 2. 目标库已有数据(先清空再迁移) ```bash python scripts/migrate_db.py --truncate-target \ --src-driver=mysql --src-host=127.0.0.1 --src-port=3306 \ --src-db=djangoadmin.django.elevue --src-user=root --src-pass=root \ --dst-driver=postgresql --dst-host=127.0.0.1 --dst-port=5432 \ --dst-db=djangoadmin.django.elevue --dst-user=postgres --dst-pass=postgres ``` ### 3. 先删除目标库再重建 ```bash python scripts/migrate_db.py --drop-target-first \ --src-driver=mysql --src-host=127.0.0.1 --src-port=3306 \ --src-db=djangoadmin.django.elevue --src-user=root --src-pass=root \ --dst-driver=postgresql --dst-host=127.0.0.1 --dst-port=5432 \ --dst-db=djangoadmin.django.elevue --dst-user=postgres --dst-pass=postgres ``` ### 4. 干跑模式(查看计划) ```bash python scripts/migrate_db.py --dry-run \ --src-driver=mysql --src-host=127.0.0.1 --src-port=3306 \ --src-db=djangoadmin.django.elevue --src-user=root --src-pass=root \ --dst-driver=postgresql --dst-db=test \ --dst-user=postgres --dst-pass=postgres ``` ## 📋 参数说明 | 参数 | 说明 | 默认值 | |------|------|--------| | `--src-driver` | 源库驱动 | mysql | | `--src-host` | 源库主机 | 127.0.0.1 | | `--src-port` | 源库端口 | 自动识别 | | `--src-db` | 源库名称 | 必填 | | `--src-user` | 源库用户名 | root | | `--src-pass` | 源库密码 | 空 | | `--dst-driver` | 目标库驱动 | 必填 | | `--dst-host` | 目标库主机 | 127.0.0.1 | | `--dst-port` | 目标库端口 | 自动识别 | | `--dst-db` | 目标库名称 | 必填 | | `--dst-user` | 目标库用户名 | postgres | | `--dst-pass` | 目标库密码 | 空 | | `--drop-target-first` | 先删除目标库 | False | | `--truncate-target` | 先清空目标表数据 | False | | `--dry-run` | 干跑模式 | False | | `--chunk-size` | 每批插入行数 | 1000 | | `--only-tables` | 只迁移指定表 | 空(全部) | | `--skip-existing` | 跳过已存在的表 | False | | `--skip-verify` | 跳过校验 | False | | `--single-transaction` | 单事务模式 | False | | `--prefix` | 表前缀 | 从 .env 读取 | ## 🔧 依赖安装 ```bash # PostgreSQL pip install psycopg # SQL Server pip install pymssql # Oracle pip install oracledb # MySQL(通常已安装) pip install pymysql ``` ## 📖 更多信息 - 快速参考:运行 `bash scripts/migrate_quick_ref.sh` - 详细文档:查看 `scripts/MIGRATE_README.md` - 变更说明:查看 `scripts/CHANGELOG_MIGRATE.md` ## 🎉 技术亮点 1. **方言可移植**:使用 SQLAlchemy ORM 模型定义表结构,保证在所有数据库方言中都有对应实现 2. **拓扑序迁移**:基础表在前,依赖表在后,保证引用完整性 3. **批量插入**:显式带 id 插入,保住裸列引用关系 4. **自动序列重置**:按方言重置自增序列(PG setval / MSSQL DBCC CHECKIDENT / Oracle sequence+trigger) 5. **数据校验**:迁移后自动对比源库和目标库的行数 6. **支持所有Django表**:包括内置表(auth_*、django_*、captcha_*)和业务表