Files
ai_baijiahao/DATABASE_MIGRATION.md

178 lines
4.4 KiB
Markdown
Raw Permalink 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.

# SQLite 数据库迁移说明
## 概述
系统已从 JSON 文件存储迁移到 SQLite 数据库,提供更好的性能、并发支持和数据完整性。
## 主要变更
### 1. 新增文件
- `database.py` - SQLite 数据库管理模块
- `test_database.py` - 数据库功能测试脚本
- `data/baijiahao.db` - SQLite 数据库文件(自动创建)
### 2. 修改文件
- `task_queue.py` - 使用 SQLite 替代 JSON 文件存储
### 3. 数据迁移
- 旧数据自动从 `data/task_queue.json` 迁移到数据库
- 迁移成功后会创建备份文件 `data/task_queue.json.backup`
- 原 JSON 文件保留,可安全删除
## 数据库结构
### tasks 表
```sql
CREATE TABLE tasks (
task_id TEXT PRIMARY KEY, -- 任务ID
url TEXT NOT NULL, -- 百家号URL
months REAL NOT NULL, -- 获取月数
use_proxy INTEGER NOT NULL, -- 是否使用代理 (0/1)
proxy_api_url TEXT, -- 代理API地址
username TEXT, -- 用户名
status TEXT NOT NULL, -- 任务状态
created_at TEXT NOT NULL, -- 创建时间
started_at TEXT, -- 开始时间
completed_at TEXT, -- 完成时间
progress INTEGER DEFAULT 0, -- 进度 (0-100)
current_step TEXT, -- 当前步骤
total_articles INTEGER DEFAULT 0, -- 总文章数
processed_articles INTEGER DEFAULT 0, -- 已处理文章数
error TEXT, -- 错误信息
result_file TEXT -- 结果文件路径
);
```
### 索引
- `idx_tasks_status` - 状态索引(加速状态查询)
- `idx_tasks_username` - 用户名索引(加速用户过滤)
- `idx_tasks_created_at` - 创建时间索引(加速时间排序)
## 优势
### 1. 性能提升
- 索引支持,查询速度更快
- 优化的 SQL 查询,减少内存占用
- 不再需要每次操作都读写整个文件
### 2. 并发安全
- 线程安全的连接管理
- 数据库级别的事务支持
- 避免文件锁冲突
### 3. 数据完整性
- 主键约束防止重复
- 事务支持确保数据一致性
- 异常回滚机制
### 4. 可扩展性
- 易于添加新字段和索引
- 支持复杂查询和统计
- 便于后续功能扩展
## 使用说明
### 测试数据库功能
```bash
python test_database.py
```
### 手动迁移数据
```python
from database import migrate_from_json
# 从 JSON 迁移到数据库
count = migrate_from_json("data/task_queue.json")
print(f"迁移了 {count} 个任务")
```
### 直接使用数据库
```python
from database import get_database
db = get_database()
with db.get_connection() as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM tasks")
tasks = cursor.fetchall()
```
## 向后兼容
- 原有 API 接口不变
- 无需修改调用代码
- 自动迁移旧数据
- 保留原 JSON 文件
## 注意事项
1. **首次启动**:系统会自动创建数据库和迁移数据
2. **备份**:迁移成功后建议备份 `data/baijiahao.db`
3. **清理**:确认迁移成功后可删除 `data/task_queue.json`
4. **性能**:大量任务时数据库性能优势明显
## 故障排除
### 数据库锁定
如果遇到 "database is locked" 错误:
- 检查是否有多个进程同时访问
- 重启应用程序
- 增加超时时间已设置为30秒
### 迁移失败
如果迁移失败:
- 检查 `data/task_queue.json` 格式
- 查看日志错误信息
- 手动运行 `test_database.py` 测试
### 数据丢失
- 检查 `data/task_queue.json.backup` 备份文件
- 从备份恢复后重新迁移
- 使用 SQLite 工具直接查看数据库
## 性能优化
### 已实施的优化
- 添加索引加速查询
- 使用事务批量操作
- 连接池复用连接
- Row factory 减少转换
### 未来优化方向
- 定期清理旧任务
- 数据归档机制
- 分表策略
- 查询缓存
## 相关命令
### 查看数据库
```bash
# 使用 SQLite 命令行工具
sqlite3 data/baijiahao.db
# 查看表结构
.schema tasks
# 查看所有任务
SELECT * FROM tasks;
# 统计任务数量
SELECT status, COUNT(*) FROM tasks GROUP BY status;
```
### 备份数据库
```bash
# 简单备份
cp data/baijiahao.db data/baijiahao.db.backup
# 使用 SQLite 工具备份
sqlite3 data/baijiahao.db ".backup data/baijiahao.db.backup"
```
### 恢复数据库
```bash
# 从备份恢复
cp data/baijiahao.db.backup data/baijiahao.db
```