Files
DjangoAdmin_Django_EleVue/scripts/README.md
T
2026-09-11 11:39:07 +08:00

111 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DjangoAdmin 数据库迁移工具
## 简介
这是一个跨数据库迁移工具,支持将 DjangoAdmin 项目的数据从 MySQL 迁移到 PostgreSQL、SQL Server、SQLite、Oracle 等数据库。
## 核心特性
- ✅ **方言可移植**:使用 SQLAlchemy ORM 模型定义表结构,保证在所有数据库方言中都有对应实现
- ✅ **拓扑序迁移**:基础表在前,依赖表在后,保证引用完整性
- ✅ **批量插入**:显式带 id 插入,保住裸列引用关系
- ✅ **自动序列重置**:按方言重置自增序列(PG setval / MSSQL DBCC CHECKIDENT / Oracle sequence+trigger)
- ✅ **数据校验**:迁移后自动对比源库和目标库的行数
## 快速开始
### 1. 安装依赖
```bash
# PostgreSQL
pip install psycopg
# SQL Server
pip install pymssql
# Oracle
pip install oracledb
```
### 2. 执行迁移
```bash
# MySQL → PostgreSQL(首次迁移或目标库为空时)
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
# MySQL → PostgreSQL(目标库已有数据,先清空再迁移)
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
# MySQL → PostgreSQL(先删除目标库再重建)
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
```
### 3. 干跑模式(查看计划)
```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
```
## 文件清单
| 文件 | 说明 |
|------|------|
| `migrate_db.py` | 主迁移脚本 |
| `MIGRATE_README.md` | 详细使用说明 |
| `migrate_quick_ref.sh` | 快速参考脚本 |
| `CHANGELOG_MIGRATE.md` | 变更说明 |
## 成功案例
```
[迁移开始] 源: 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
```
**迁移的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 等
## 技术架构
### 核心设计(参考FastAPI版本)
1. **模型定义**:使用 SQLAlchemy ORM 定义表结构,保证方言可移植
2. **拓扑排序**:基础表在前,依赖表在后,保证引用完整性
3. **批量插入**:显式带 id 插入,保住裸列引用关系
4. **序列重置**:按方言重置自增序列
### 迁移流程
```
加载Django模型 → 创建SQLAlchemy ORM模型 → 建目标库 → 建表结构 → 迁移数据 → 重置序列 → 校验数据
```
## 更多信息
- 详细使用说明:[MIGRATE_README.md](MIGRATE_README.md)
- 变更说明:[CHANGELOG_MIGRATE.md](CHANGELOG_MIGRATE.md)
- 快速参考:运行 `bash scripts/migrate_quick_ref.sh`