Initial commit: 百家号文章采集系统
This commit is contained in:
177
DATABASE_MIGRATION.md
Normal file
177
DATABASE_MIGRATION.md
Normal file
@@ -0,0 +1,177 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user