Files
assist/database_migration_notes.md

120 lines
4.0 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.
# 数据库迁移说明
## 工单处理过程记录系统迁移
### 新增表:`work_order_process_history`
```sql
CREATE TABLE IF NOT EXISTS work_order_process_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
work_order_id INTEGER NOT NULL,
processor_name VARCHAR(100) NOT NULL,
processor_role VARCHAR(50),
processor_region VARCHAR(50),
process_content TEXT NOT NULL,
action_type VARCHAR(50) NOT NULL,
previous_status VARCHAR(50),
new_status VARCHAR(50),
assigned_module VARCHAR(50),
process_time DATETIME NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (work_order_id) REFERENCES work_orders(id)
);
CREATE INDEX idx_process_history_workorder ON work_order_process_history(work_order_id);
CREATE INDEX idx_process_history_time ON work_order_process_history(process_time);
```
### WorkOrder表新增字段
如果使用SQLite可以使用以下SQL添加字段
```sql
-- 注意SQLite不支持直接ALTER TABLE添加多个列需要逐个添加
ALTER TABLE work_orders ADD COLUMN assigned_module VARCHAR(50);
ALTER TABLE work_orders ADD COLUMN module_owner VARCHAR(100);
ALTER TABLE work_orders ADD COLUMN dispatcher VARCHAR(100);
ALTER TABLE work_orders ADD COLUMN dispatch_time DATETIME;
ALTER TABLE work_orders ADD COLUMN region VARCHAR(50);
```
### 使用Python脚本迁移推荐
创建迁移脚本 `migrate_process_history.py`
```python
# -*- coding: utf-8 -*-
"""
数据库迁移脚本:添加工单处理过程记录表和相关字段
"""
from src.core.database import db_manager
from src.core.models import Base, WorkOrderProcessHistory
from sqlalchemy import text
def migrate_database():
"""执行数据库迁移"""
try:
with db_manager.get_session() as session:
# 创建新表
WorkOrderProcessHistory.__table__.create(db_manager.engine, checkfirst=True)
# 检查并添加新字段SQLite需要特殊处理
try:
# 尝试添加字段(如果已存在会报错,可以忽略)
session.execute(text("ALTER TABLE work_orders ADD COLUMN assigned_module VARCHAR(50)"))
except Exception as e:
print(f"字段 assigned_module 可能已存在: {e}")
try:
session.execute(text("ALTER TABLE work_orders ADD COLUMN module_owner VARCHAR(100)"))
except Exception as e:
print(f"字段 module_owner 可能已存在: {e}")
try:
session.execute(text("ALTER TABLE work_orders ADD COLUMN dispatcher VARCHAR(100)"))
except Exception as e:
print(f"字段 dispatcher 可能已存在: {e}")
try:
session.execute(text("ALTER TABLE work_orders ADD COLUMN dispatch_time DATETIME"))
except Exception as e:
print(f"字段 dispatch_time 可能已存在: {e}")
try:
session.execute(text("ALTER TABLE work_orders ADD COLUMN region VARCHAR(50)"))
except Exception as e:
print(f"字段 region 可能已存在: {e}")
session.commit()
print("数据库迁移完成!")
except Exception as e:
print(f"数据库迁移失败: {e}")
raise
if __name__ == "__main__":
migrate_database()
```
### 执行迁移
运行迁移脚本:
```bash
python migrate_process_history.py
```
或者直接在Python交互式环境中执行
```python
from migrate_process_history import migrate_database
migrate_database()
```
## 注意事项
1. **备份数据库**:在执行迁移前,请务必备份现有数据库
2. **SQLite限制**如果使用SQLiteALTER TABLE添加列的操作在某些情况下可能失败如果字段已存在会报错
3. **数据迁移**:现有工单的处理过程历史记录(存储在`resolution`字段中的)不会自动迁移到新表,需要手动处理
4. **索引优化**:新表已包含必要的索引,如果数据量大可以考虑添加更多索引