# 数据库模块使用说明

## 概述

数据库模块为AI换脸系统提供完整的数据存储和管理功能，包括：

- **数据库连接管理** - 支持SQLite和MySQL
- **数据模型定义** - 用户、图片、处理记录等表结构
- **CRUD操作封装** - 完整的数据库操作接口
- **数据库迁移** - 版本管理和迁移功能

## 目录结构

```
database/
├── __init__.py              # 模块初始化
├── connection.py            # 数据库连接管理
├── models.py               # 数据模型定义
├── operations.py           # CRUD操作封装
├── migrations.py           # 数据库迁移
├── migrations/             # 迁移文件目录
│   └── example_migration.json
├── example_usage.py        # 使用示例
└── README.md              # 说明文档
```

## 快速开始

### 1. 安装依赖

```bash
pip install -r requirements_database.txt
```

### 2. 初始化数据库

```python
from backend.modules.database import DatabaseMigration

# 初始化数据库
migration = DatabaseMigration()
if migration.init_database():
    print("数据库初始化成功")
```

### 3. 基本使用

```python
from backend.modules.database import DatabaseOperations

# 创建数据库操作实例
db_ops = DatabaseOperations()

# 创建用户
user = db_ops.create_user(
    username="test_user",
    email="test@example.com"
)

# 创建图片记录
image_record = db_ops.create_image_record(
    user_id=user.id,
    image_type="face",
    original_filename="face.jpg",
    stored_path="/data/images/face_001.jpg"
)

# 创建处理记录
process_record = db_ops.create_process_record(
    user_id=user.id,
    face_image_id=image_record.id,
    cloth_image_id=cloth_image.id,
    prompt="美女站在海边"
)
```

## 数据模型

### 用户表 (users)
- `id` - 用户ID
- `username` - 用户名
- `email` - 邮箱
- `api_key` - API密钥
- `is_active` - 是否激活
- `is_admin` - 是否管理员

### 图片记录表 (image_records)
- `id` - 图片记录ID
- `user_id` - 用户ID
- `image_type` - 图片类型 (face/cloth/result)
- `original_filename` - 原始文件名
- `stored_path` - 存储路径
- `file_size` - 文件大小
- `image_hash` - 图片哈希值

### AI换脸处理记录表 (process_records)
- `id` - 处理记录ID
- `user_id` - 用户ID
- `face_image_id` - 人脸图片ID
- `cloth_image_id` - 服装图片ID
- `result_image_id` - 生成结果图片ID
- `prompt` - 主要处理提示词
- `generated_text` - AI生成的文案内容
- `text_style` - 文案风格(正式/轻松/创意等)
- `face_prompt` - 人脸识别提示词
- `cloth_prompt` - 服装识别提示词
- `seed` - 随机种子
- `workflow_version` - 工作流版本
- `model_version` - AI模型版本
- `status` - 处理状态(pending/processing/completed/failed)
- `progress` - 处理进度(0-100)
- `processing_time` - 处理耗时(秒)
- `gpu_usage` - GPU使用率
- `memory_usage` - 内存使用量(MB)

### 系统配置表 (system_configs)
- `id` - 配置ID
- `config_key` - 配置键
- `config_value` - 配置值
- `config_type` - 配置类型
- `is_public` - 是否公开

## 主要功能

### 数据库连接管理

```python
from backend.modules.database import DatabaseConnection

# SQLite连接
db_conn = DatabaseConnection(
    db_type="sqlite",
    database="backend/data/ai_swap.db"
)

# MySQL连接
db_conn = DatabaseConnection(
    db_type="mysql",
    host="localhost",
    port=3306,
    database="ai_swap",
    username="root",
    password="password"
)

# 测试连接
if db_conn.test_connection():
    print("连接成功")
```

### 用户管理

```python
# 创建用户
user = db_ops.create_user("username", "email@example.com")

# 查询用户
user = db_ops.get_user_by_username("username")
user = db_ops.get_user_by_api_key("api_key")

# 更新用户
db_ops.update_user(user.id, is_active=False)

# 删除用户
db_ops.delete_user(user.id)
```

### 图片记录管理

```python
# 创建图片记录
image = db_ops.create_image_record(
    user_id=user.id,
    image_type="face",
    original_filename="face.jpg",
    stored_path="/path/to/image.jpg"
)

# 查询用户图片
images = db_ops.get_user_images(user.id, image_type="face")

# 更新图片记录
db_ops.update_image_record(image.id, file_size=1024000)

# 删除图片记录（软删除）
db_ops.delete_image_record(image.id, soft_delete=True)
```

### AI换脸处理记录管理

```python
# 创建AI换脸处理记录
process = db_ops.create_process_record(
    user_id=user.id,
    face_image_id=face_image.id,
    cloth_image_id=cloth_image.id,
    prompt="时尚模特在巴黎街头",
    face_prompt="保持面部特征清晰",
    cloth_prompt="时尚服装风格",
    seed=42,
    workflow_version="2.0.0",
    model_version="stable-diffusion-xl"
)

# 保存结果图片和生成的文案
db_ops.save_result_image(
    process_id=process.id,
    result_image_id=result_image.id,
    generated_text="时尚模特在巴黎街头展现优雅气质",
    text_style="时尚"
)

# 更新性能指标
db_ops.update_processing_metrics(
    process_id=process.id,
    processing_time=15.5,
    gpu_usage=85.2,
    memory_usage=2048.0
)

# 获取用户AI换脸历史
history = db_ops.get_user_ai_swap_history(user.id, page=1, page_size=20)

# 获取成功的换脸记录
successful_swaps = db_ops.get_successful_swaps(user.id, limit=10)

# 搜索特定提示词的处理记录
search_results = db_ops.search_processes_by_prompt("海边", user.id)
```

### 系统配置管理

```python
# 设置配置
db_ops.set_config(
    "max_image_size",
    10485760,
    config_type="int",
    description="最大图片文件大小"
)

# 获取配置值
max_size = db_ops.get_config_value("max_image_size", default=5242880)

# 获取配置列表
configs = db_ops.list_configs(is_public=True)
```

### 数据库迁移

```python
from backend.modules.database import DatabaseMigration

migration = DatabaseMigration()

# 创建迁移文件
migration_file = migration.create_migration(
    version="1.1.0",
    description="添加新字段",
    up_sql="ALTER TABLE users ADD COLUMN new_field TEXT;",
    down_sql="ALTER TABLE users DROP COLUMN new_field;"
)

# 执行迁移
migration.migrate_up()

# 回滚迁移
migration.migrate_down("1.0.0")

# 检查数据库健康状态
health = migration.check_database_health()
```

## AI换脸专用功能

### 完整工作流示例

```python
from backend.modules.database import DatabaseOperations

db_ops = DatabaseOperations()

# 1. 创建用户
user = db_ops.create_user("ai_user", "ai@example.com")

# 2. 上传人脸图片
face_image = db_ops.create_image_record(
    user_id=user.id,
    image_type="face",
    original_filename="face.jpg",
    stored_path="/data/images/face_001.jpg"
)

# 3. 上传服装图片
cloth_image = db_ops.create_image_record(
    user_id=user.id,
    image_type="cloth",
    original_filename="cloth.jpg",
    stored_path="/data/images/cloth_001.jpg"
)

# 4. 创建处理记录
process = db_ops.create_process_record(
    user_id=user.id,
    face_image_id=face_image.id,
    cloth_image_id=cloth_image.id,
    prompt="美女站在海边",
    workflow_version="1.0.0",
    model_version="stable-diffusion-v1.5"
)

# 5. 处理完成后保存结果
result_image = db_ops.create_image_record(
    user_id=user.id,
    image_type="result",
    original_filename="result.jpg",
    stored_path="/data/images/result_001.jpg"
)

db_ops.save_result_image(
    process_id=process.id,
    result_image_id=result_image.id,
    generated_text="美丽的海边风景，阳光明媚",
    text_style="轻松"
)
```

### 性能监控

```python
# 更新处理性能指标
db_ops.update_processing_metrics(
    process_id=process.id,
    processing_time=12.5,
    gpu_usage=85.2,
    memory_usage=2048.0
)
```

### 历史记录查询

```python
# 获取用户AI换脸历史
history = db_ops.get_user_ai_swap_history(user.id, page=1, page_size=20)

# 获取成功的换脸记录
successful_swaps = db_ops.get_successful_swaps(user.id, limit=10)

# 搜索特定提示词
search_results = db_ops.search_processes_by_prompt("海边", user.id)
```

## 高级功能

### 统计信息

```python
# 获取系统统计信息
stats = db_ops.get_statistics()
print(f"总用户数: {stats['total_users']}")
print(f"人脸图片数: {stats['face_images']}")
print(f"服装图片数: {stats['cloth_images']}")
print(f"结果图片数: {stats['result_images']}")
print(f"完成率: {stats['completion_rate']:.2f}%")
print(f"平均处理时间: {stats['avg_processing_time']}秒")
```

### 分页查询

```python
# 分页获取用户列表
result = db_ops.list_users(page=1, page_size=20, is_active=True)
print(f"用户列表: {result['users']}")
print(f"总页数: {result['total_pages']}")
```

### 事务管理

```python
# 使用上下文管理器自动管理事务
with db_connection.get_session() as session:
    # 执行数据库操作
    session.add(new_record)
    # 自动提交或回滚
```

## 配置说明

### 数据库配置

默认使用SQLite数据库，文件位置：`backend/data/ai_swap.db`

如需使用MySQL，请修改连接参数：

```python
db_conn = DatabaseConnection(
    db_type="mysql",
    host="localhost",
    port=3306,
    database="ai_swap",
    username="your_username",
    password="your_password"
)
```

### 连接池配置

- `pool_size`: 连接池大小（默认10）
- `max_overflow`: 最大溢出连接数（默认20）
- `pool_recycle`: 连接回收时间（MySQL默认3600秒）

## 错误处理

所有数据库操作都包含完整的错误处理：

```python
try:
    user = db_ops.create_user("username", "email")
except Exception as e:
    logger.error(f"创建用户失败: {e}")
    # 处理错误
```

## 性能优化

1. **索引优化**: 所有常用查询字段都已建立索引
2. **连接池**: 使用SQLAlchemy连接池管理数据库连接
3. **分页查询**: 支持分页查询避免大量数据加载
4. **软删除**: 图片记录支持软删除，避免数据丢失

## 安全考虑

1. **SQL注入防护**: 使用SQLAlchemy ORM防止SQL注入
2. **密码哈希**: 用户密码使用哈希存储
3. **API密钥**: 每个用户都有唯一的API密钥
4. **权限控制**: 支持管理员和普通用户权限区分

## 测试

运行示例代码测试数据库功能：

```bash
cd backend/modules/database
python example_usage.py
```

## 常见问题

### Q: 如何切换数据库类型？
A: 修改DatabaseConnection的db_type参数，SQLite为"sqlite"，MySQL为"mysql"

### Q: 如何处理数据库迁移？
A: 使用DatabaseMigration类创建和执行迁移文件

### Q: 如何备份数据库？
A: SQLite直接复制数据库文件，MySQL使用mysqldump命令

### Q: 如何优化查询性能？
A: 确保查询条件使用索引字段，使用分页查询避免大量数据加载 