Files
MuMuAINovel/CAREER_SYSTEM_MIGRATION.md
T
xiamuceer-j 2b8e5db1cc docs: 添加职业系统迁移指南
- 为新用户和现有用户提供完整的升级步骤
- 说明迁移脚本的具体操作
- 包含验证步骤和常见问题解答
- 提供回滚方案(仅用于紧急情况)
2025-12-23 03:33:20 +08:00

239 lines
6.4 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.
# 职业系统迁移指南
## 📋 概述
该指南适用于升级到包含职业系统(Career System)功能的版本的用户。职业系统引入了两个新的数据库表和对现有 `characters` 表的扩展。
## 🔍 适用场景
### 情况1:新用户部署(推荐)
**条件**:首次部署MuMuAINovel
**操作**:无需额外步骤
- 应用启动时会自动创建所有必需的表和列
- SQLAlchemy ORM会在首次初始化时建立完整的数据库架构
### 情况2:现有用户升级(需要操作)
**条件**:已有运行中的MuMuAINovel实例,需要升级到职业系统版本
**需要执行**:数据库迁移脚本
---
## 🛠️ 升级步骤
### 步骤1:备份数据库
```bash
# 使用Docker备份PostgreSQL数据库
docker exec mumuainovel-postgres pg_dump -U mumuai mumuai_novel > backup_before_career_migration.sql
# 或使用Docker Compose卷备份
docker run -v mumuainovel_postgres_data:/data -v $(pwd):/backup \
postgres:18-alpine \
tar czf /backup/postgres_backup_$(date +%Y%m%d_%H%M%S).tar.gz /data
```
### 步骤2:升级代码
```bash
# 拉取最新代码
git pull origin main
# 如果使用Docker
docker-compose down
docker-compose up -d # 重新启动带最新代码的容器
```
### 步骤3:执行数据库迁移
在升级后首次启动应用之前执行迁移脚本:
```bash
# 方式A:使用Docker exec执行(推荐)
docker exec mumuainovel-postgres psql -U mumuai -d mumuai_novel \
-f /scripts/create_career_tables.sql
# 方式B:使用本地psql(如果已安装PostgreSQL
psql -h localhost -U mumuai -d mumuai_novel \
-f backend/scripts/create_career_tables.sql
```
### 步骤4:验证迁移
```bash
# 检查新表是否创建
docker exec mumuainovel-postgres psql -U mumuai -d mumuai_novel -c "
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name;"
# 检查characters表的新列
docker exec mumuainovel-postgres psql -U mumuai -d mumuai_novel -c "
\d characters"
```
**预期结果:**
- 应看到 `careers`
- 应看到 `character_careers`
- `characters` 表应包含新列:
- `main_career_id` (UUID)
- `main_career_stage` (String, 可空)
- `sub_careers` (JSON, 可空)
### 步骤5:重启应用
```bash
# 如果使用Docker
docker-compose restart mumuainovel
# 或
docker-compose down && docker-compose up -d
```
---
## 📊 迁移脚本详解
`backend/scripts/create_career_tables.sql` 执行以下操作:
### 创建的表
#### 1. `careers` 表
职业类型定义表,存储项目中定义的所有职业
| 列名 | 类型 | 说明 |
|------|------|------|
| `id` | UUID | 主键 |
| `user_id` | String | 用户ID(多用户隔离) |
| `project_id` | UUID | 项目ID外键 |
| `career_type` | String | 职业类型(main/sub |
| `name` | String | 职业名称 |
| `description` | Text | 职业描述 |
| `stages` | JSON | 职业阶段定义 |
| `created_at` | DateTime | 创建时间 |
| `updated_at` | DateTime | 更新时间 |
#### 2. `character_careers` 表
角色职业关联表,记录每个角色的职业信息和进度
| 列名 | 类型 | 说明 |
|------|------|------|
| `id` | UUID | 主键 |
| `user_id` | String | 用户ID(多用户隔离) |
| `character_id` | UUID | 角色ID外键 |
| `career_id` | UUID | 职业ID外键 |
| `current_stage` | String | 当前职业阶段 |
| `progress` | JSON | 职业进度详情 |
| `created_at` | DateTime | 创建时间 |
| `updated_at` | DateTime | 更新时间 |
### 对 `characters` 表的修改
添加三个新列用于快速访问主要职业信息:
| 列名 | 类型 | 说明 |
|------|------|------|
| `main_career_id` | UUID | 主职业ID外键 |
| `main_career_stage` | String | 主职业当前阶段 |
| `sub_careers` | JSON | 副职业ID数组 |
---
## ⚠️ 常见问题
### Q: 迁移会影响现有数据吗?
**A:** 不会。迁移脚本只创建新表和添加新列,不会删除或修改现有数据。新列初始为空/null。
### Q: 如果我遗漏了迁移脚本会怎样?
**A:** 应用会崩溃,错误信息:
```
sqlalchemy.exc.ProgrammingError: column characters.main_career_id does not exist
```
此时需要回到步骤3执行迁移脚本。
### Q: 可以在应用运行时执行迁移吗?
**A:** 可以,但**强烈不推荐**。最佳实践:
1. 停止应用:`docker-compose down`
2. 执行迁移
3. 重启应用:`docker-compose up -d`
### Q: 迁移需要多长时间?
**A:** 通常 < 1秒(对于大多数数据库)。具体时间取决于:
- 数据库大小
- 系统性能
- PostgreSQL配置
### Q: 如何回滚迁移?
**A:** 迁移可以通过以下SQL脚本回滚(**谨慎操作**):
```sql
-- 删除外键约束
ALTER TABLE character_careers DROP CONSTRAINT IF EXISTS fk_character_id;
ALTER TABLE character_careers DROP CONSTRAINT IF EXISTS fk_career_id;
ALTER TABLE characters DROP CONSTRAINT IF EXISTS fk_main_career_id;
-- 删除新表
DROP TABLE IF EXISTS character_careers CASCADE;
DROP TABLE IF EXISTS careers CASCADE;
-- 删除characters表的新列
ALTER TABLE characters
DROP COLUMN IF EXISTS main_career_id,
DROP COLUMN IF EXISTS main_career_stage,
DROP COLUMN IF EXISTS sub_careers;
```
---
## 🔧 Docker Compose 用户快速命令
```bash
# 一键迁移(假设容器已运行)
docker exec mumuainovel-postgres psql -U mumuai -d mumuai_novel << EOF
\i /scripts/create_career_tables.sql
EOF
# 验证迁移
docker exec mumuainovel-postgres psql -U mumuai -d mumuai_novel -c "\d careers"
# 查看characters表结构
docker exec mumuainovel-postgres psql -U mumuai -d mumuai_novel -c "\d characters" | grep -E "main_career|sub_careers"
```
---
## 📞 获取帮助
如果迁移过程中遇到问题:
1. **检查数据库连接**
```bash
docker exec mumuainovel-postgres psql -U mumuai -d mumuai_novel -c "SELECT 1"
```
2. **查看应用日志**
```bash
docker-compose logs -f mumuainovel
```
3. **检查PostgreSQL日志**
```bash
docker-compose logs -f mumuainovel-postgres
```
4. **提交Issue**
包含以下信息:
- Docker版本
- PostgreSQL版本
- 迁移脚本执行输出
- 应用错误日志
---
## ✅ 迁移检查清单
- [ ] 已备份现有数据库
- [ ] 已拉取最新代码
- [ ] 已停止应用(如果使用Docker
- [ ] 已执行迁移脚本
- [ ] 已验证新表和新列存在
- [ ] 已重启应用
- [ ] 应用启动无错误
- [ ] 可以访问现有项目和角色
- [ ] 可以创建新角色且包含职业信息