|
| 1 | +# 数据库配置说明 |
| 2 | + |
| 3 | +## 功能概述 |
| 4 | + |
| 5 | +本项目新增了 MySQL 请求日志功能,用于记录每次 HTML 解析请求的详细信息,包括: |
| 6 | + |
| 7 | +- **任务ID** (`task_id`): 用于关联同一任务的多个请求 |
| 8 | +- **请求ID** (`request_id`): 每次请求的唯一标识符(自动生成UUID) |
| 9 | +- **输入类型** (`input_type`): html_content(HTML字符串)、url(URL地址)、file(文件上传) |
| 10 | +- **输入HTML** (`input_html`): 输入的HTML字符串内容 |
| 11 | +- **URL** (`url`): 输入的URL地址 |
| 12 | +- **输出Markdown** (`output_markdown`): 解析后输出的Markdown格式内容 |
| 13 | +- **成功状态** (`is_success`): 请求是否成功 |
| 14 | +- **错误信息** (`error_message`): 失败时的详细错误信息 |
| 15 | +- **创建时间** (`created_at`): 请求创建时间 |
| 16 | +- **更新时间** (`updated_at`): 记录最后更新时间 |
| 17 | + |
| 18 | +## 数据库设置 |
| 19 | + |
| 20 | +### 1. 安装 MySQL |
| 21 | + |
| 22 | +确保已安装 MySQL 5.7+ 或 MariaDB 10.2+。 |
| 23 | + |
| 24 | +### 2. 创建数据库和表 |
| 25 | + |
| 26 | +执行 `database_setup.sql` 文件中的 SQL 语句: |
| 27 | + |
| 28 | +```bash |
| 29 | +mysql -u root -p < database_setup.sql |
| 30 | +``` |
| 31 | + |
| 32 | +或者登录 MySQL 后执行: |
| 33 | + |
| 34 | +```sql |
| 35 | +source /path/to/database_setup.sql; |
| 36 | +``` |
| 37 | + |
| 38 | +### 3. 配置环境变量 |
| 39 | + |
| 40 | +复制 `.env.example` 为 `.env`: |
| 41 | + |
| 42 | +```bash |
| 43 | +cp .env.example .env |
| 44 | +``` |
| 45 | + |
| 46 | +编辑 `.env` 文件,配置数据库连接: |
| 47 | + |
| 48 | +```env |
| 49 | +DATABASE_URL=mysql+aiomysql://root:your_password@localhost:3306/llm_web_kit |
| 50 | +``` |
| 51 | + |
| 52 | +**连接字符串格式说明:** |
| 53 | + |
| 54 | +``` |
| 55 | +mysql+aiomysql://用户名:密码@主机:端口/数据库名 |
| 56 | +``` |
| 57 | + |
| 58 | +**示例:** |
| 59 | + |
| 60 | +- 本地开发: `mysql+aiomysql://root:123456@localhost:3306/llm_web_kit` |
| 61 | +- 远程服务器: `mysql+aiomysql://user:pass@192.168.1.100:3306/llm_web_kit` |
| 62 | + |
| 63 | +### 4. 安装依赖 |
| 64 | + |
| 65 | +```bash |
| 66 | +pip install -r requirements.txt |
| 67 | +``` |
| 68 | + |
| 69 | +新增的依赖包括: |
| 70 | + |
| 71 | +- `sqlalchemy>=2.0.0` - ORM框架 |
| 72 | +- `aiomysql>=0.2.0` - 异步MySQL驱动 |
| 73 | +- `pymysql>=1.1.0` - MySQL客户端库 |
| 74 | + |
| 75 | +## 使用说明 |
| 76 | + |
| 77 | +### 启动服务 |
| 78 | + |
| 79 | +```bash |
| 80 | +python llm_web_kit/api/run_server.py |
| 81 | +``` |
| 82 | + |
| 83 | +或者: |
| 84 | + |
| 85 | +```bash |
| 86 | +python -m llm_web_kit.api.main |
| 87 | +``` |
| 88 | + |
| 89 | +### API 调用示例 |
| 90 | + |
| 91 | +#### 1. 解析 HTML 内容 |
| 92 | + |
| 93 | +```bash |
| 94 | +curl -X POST "http://127.0.0.1:8000/api/v1/html/parse" \ |
| 95 | + -H "Content-Type: application/json" \ |
| 96 | + -d '{ |
| 97 | + "html_content": "<html><body><h1>Hello World</h1></body></html>", |
| 98 | + "url": "https://example.com", |
| 99 | + "options": { |
| 100 | + "task_id": "task_001", |
| 101 | + "clean_html": true |
| 102 | + } |
| 103 | + }' |
| 104 | +``` |
| 105 | + |
| 106 | +**响应示例:** |
| 107 | + |
| 108 | +```json |
| 109 | +{ |
| 110 | + "success": true, |
| 111 | + "message": "HTML 解析成功", |
| 112 | + "timestamp": "2025-10-27T15:30:00.123456", |
| 113 | + "request_id": "550e8400-e29b-41d4-a716-446655440000", |
| 114 | + "data": { |
| 115 | + "markdown": "# Hello World", |
| 116 | + ... |
| 117 | + } |
| 118 | +} |
| 119 | +``` |
| 120 | + |
| 121 | +#### 2. 上传 HTML 文件 |
| 122 | + |
| 123 | +```bash |
| 124 | +curl -X POST "http://127.0.0.1:8000/api/v1/html/upload" \ |
| 125 | + -F "file=@/path/to/file.html" |
| 126 | +``` |
| 127 | + |
| 128 | +### 传递任务ID |
| 129 | + |
| 130 | +如果需要关联多个请求到同一任务,可以在 `options` 中传递 `task_id`: |
| 131 | + |
| 132 | +```json |
| 133 | +{ |
| 134 | + "html_content": "...", |
| 135 | + "options": { |
| 136 | + "task_id": "my_task_123" |
| 137 | + } |
| 138 | +} |
| 139 | +``` |
| 140 | + |
| 141 | +## 数据库查询示例 |
| 142 | + |
| 143 | +### 查询最近的请求记录 |
| 144 | + |
| 145 | +```sql |
| 146 | +SELECT * FROM request_logs |
| 147 | +ORDER BY created_at DESC |
| 148 | +LIMIT 100; |
| 149 | +``` |
| 150 | + |
| 151 | +### 查询某个任务的所有请求 |
| 152 | + |
| 153 | +```sql |
| 154 | +SELECT * FROM request_logs |
| 155 | +WHERE task_id = 'task_001' |
| 156 | +ORDER BY created_at; |
| 157 | +``` |
| 158 | + |
| 159 | +### 查询失败的请求 |
| 160 | + |
| 161 | +```sql |
| 162 | +SELECT request_id, input_type, error_message, created_at |
| 163 | +FROM request_logs |
| 164 | +WHERE is_success = 0 |
| 165 | +ORDER BY created_at DESC; |
| 166 | +``` |
| 167 | + |
| 168 | +### 统计成功率 |
| 169 | + |
| 170 | +```sql |
| 171 | +SELECT |
| 172 | + COUNT(*) as total_requests, |
| 173 | + SUM(is_success) as success_count, |
| 174 | + ROUND(SUM(is_success) / COUNT(*) * 100, 2) as success_rate |
| 175 | +FROM request_logs; |
| 176 | +``` |
| 177 | + |
| 178 | +### 按日期统计请求量 |
| 179 | + |
| 180 | +```sql |
| 181 | +SELECT |
| 182 | + DATE(created_at) as date, |
| 183 | + COUNT(*) as total, |
| 184 | + SUM(is_success) as success, |
| 185 | + COUNT(*) - SUM(is_success) as failed |
| 186 | +FROM request_logs |
| 187 | +GROUP BY DATE(created_at) |
| 188 | +ORDER BY date DESC; |
| 189 | +``` |
| 190 | + |
| 191 | +### 查询特定请求的详细信息 |
| 192 | + |
| 193 | +```sql |
| 194 | +SELECT * FROM request_logs |
| 195 | +WHERE request_id = '550e8400-e29b-41d4-a716-446655440000'; |
| 196 | +``` |
| 197 | + |
| 198 | +## 功能特性 |
| 199 | + |
| 200 | +### 1. 自动日志记录 |
| 201 | + |
| 202 | +每次调用 `/api/v1/html/parse` 或 `/api/v1/html/upload` 接口时,系统会自动: |
| 203 | + |
| 204 | +- 生成唯一的 `request_id` |
| 205 | +- 记录请求开始时间 |
| 206 | +- 保存输入参数(HTML内容、URL等) |
| 207 | +- 记录解析结果(Markdown输出) |
| 208 | +- 记录成功/失败状态和错误信息 |
| 209 | + |
| 210 | +### 2. 异步数据库操作 |
| 211 | + |
| 212 | +使用 SQLAlchemy 异步引擎和 aiomysql 驱动,不会阻塞 API 请求处理。 |
| 213 | + |
| 214 | +### 3. 优雅降级 |
| 215 | + |
| 216 | +如果数据库未配置或连接失败: |
| 217 | + |
| 218 | +- API 服务仍然正常运行 |
| 219 | +- 只是不记录请求日志 |
| 220 | +- 不影响 HTML 解析功能 |
| 221 | + |
| 222 | +### 4. 连接池管理 |
| 223 | + |
| 224 | +使用数据库连接池,提高性能: |
| 225 | + |
| 226 | +- 默认池大小: 5 |
| 227 | +- 最大溢出: 10 |
| 228 | +- 可通过环境变量配置 |
| 229 | + |
| 230 | +## 故障排查 |
| 231 | + |
| 232 | +### 问题1: 数据库连接失败 |
| 233 | + |
| 234 | +**错误信息:** |
| 235 | + |
| 236 | +``` |
| 237 | +数据库连接初始化失败: (2003, "Can't connect to MySQL server...") |
| 238 | +``` |
| 239 | + |
| 240 | +**解决方案:** |
| 241 | + |
| 242 | +1. 检查 MySQL 服务是否运行 |
| 243 | +2. 验证 `DATABASE_URL` 配置是否正确 |
| 244 | +3. 确认数据库用户权限 |
| 245 | +4. 检查防火墙设置 |
| 246 | + |
| 247 | +### 问题2: 表不存在 |
| 248 | + |
| 249 | +**错误信息:** |
| 250 | + |
| 251 | +``` |
| 252 | +Table 'llm_web_kit.request_logs' doesn't exist |
| 253 | +``` |
| 254 | + |
| 255 | +**解决方案:** |
| 256 | +执行 `database_setup.sql` 创建表: |
| 257 | + |
| 258 | +```bash |
| 259 | +mysql -u root -p llm_web_kit < database_setup.sql |
| 260 | +``` |
| 261 | + |
| 262 | +### 问题3: 依赖包缺失 |
| 263 | + |
| 264 | +**错误信息:** |
| 265 | + |
| 266 | +``` |
| 267 | +ModuleNotFoundError: No module named 'aiomysql' |
| 268 | +``` |
| 269 | + |
| 270 | +**解决方案:** |
| 271 | +安装依赖包: |
| 272 | + |
| 273 | +```bash |
| 274 | +pip install sqlalchemy aiomysql pymysql |
| 275 | +``` |
| 276 | + |
| 277 | +### 问题4: 字符编码问题 |
| 278 | + |
| 279 | +**解决方案:** |
| 280 | +确保数据库和表使用 `utf8mb4` 字符集: |
| 281 | + |
| 282 | +```sql |
| 283 | +ALTER DATABASE llm_web_kit CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
| 284 | +ALTER TABLE request_logs CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
| 285 | +``` |
| 286 | + |
| 287 | +## 性能优化建议 |
| 288 | + |
| 289 | +### 1. 定期清理历史数据 |
| 290 | + |
| 291 | +```sql |
| 292 | +-- 删除30天前的日志 |
| 293 | +DELETE FROM request_logs |
| 294 | +WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY); |
| 295 | +``` |
| 296 | + |
| 297 | +### 2. 添加分区表(可选) |
| 298 | + |
| 299 | +对于大量数据,可以按月分区: |
| 300 | + |
| 301 | +```sql |
| 302 | +ALTER TABLE request_logs |
| 303 | +PARTITION BY RANGE (TO_DAYS(created_at)) ( |
| 304 | + PARTITION p202501 VALUES LESS THAN (TO_DAYS('2025-02-01')), |
| 305 | + PARTITION p202502 VALUES LESS THAN (TO_DAYS('2025-03-01')), |
| 306 | + ... |
| 307 | +); |
| 308 | +``` |
| 309 | + |
| 310 | +### 3. 监控慢查询 |
| 311 | + |
| 312 | +启用 MySQL 慢查询日志,优化查询性能。 |
| 313 | + |
| 314 | +### 4. 调整连接池大小 |
| 315 | + |
| 316 | +根据并发量调整 `.env` 中的配置: |
| 317 | + |
| 318 | +```env |
| 319 | +DB_POOL_SIZE=10 |
| 320 | +DB_MAX_OVERFLOW=20 |
| 321 | +``` |
| 322 | + |
| 323 | +## 安全建议 |
| 324 | + |
| 325 | +1. **不要提交 .env 文件到版本控制** |
| 326 | +2. **使用强密码** |
| 327 | +3. **限制数据库用户权限**(只授予必要的权限) |
| 328 | +4. **定期备份数据库** |
| 329 | +5. **在生产环境使用 SSL 连接** |
| 330 | + |
| 331 | +## 技术架构 |
| 332 | + |
| 333 | +``` |
| 334 | +FastAPI Application |
| 335 | + ↓ |
| 336 | +Router (htmls.py) |
| 337 | + ↓ |
| 338 | +RequestLogService (request_log_service.py) |
| 339 | + ↓ |
| 340 | +DatabaseManager (database.py) |
| 341 | + ↓ |
| 342 | +SQLAlchemy + aiomysql |
| 343 | + ↓ |
| 344 | +MySQL Database |
| 345 | +``` |
| 346 | + |
| 347 | +## 相关文件 |
| 348 | + |
| 349 | +- `models/db_models.py` - 数据库模型定义 |
| 350 | +- `database.py` - 数据库连接管理 |
| 351 | +- `services/request_log_service.py` - 请求日志服务 |
| 352 | +- `routers/htmls.py` - API 路由(集成日志记录) |
| 353 | +- `database_setup.sql` - 数据库建表语句 |
| 354 | +- `.env.example` - 环境变量配置示例 |
| 355 | + |
| 356 | +## 联系支持 |
| 357 | + |
| 358 | +如有问题,请查看项目文档或提交 Issue。 |
0 commit comments