签入版本
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
# 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`
|
||||
Reference in New Issue
Block a user