完成基本分表查询

This commit is contained in:
2025-08-02 01:23:33 +08:00
parent 689328eeca
commit b7a05e56d0
4 changed files with 1087 additions and 28 deletions

133
CLAUDE.md
View File

@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## 项目架构
这是一个基于 Flask 的数据库查询比对工具,用于比较 Cassandra 数据库中生产环境和测试环境的数据差异。
这是一个基于 Flask 的数据库查询比对工具,用于比较 Cassandra 数据库中生产环境和测试环境的数据差异。现已支持单表查询和TWCS分表查询两种模式。
### 核心组件架构
@@ -15,20 +15,51 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
- 配置组管理CRUD操作
- JSON字段特殊处理和数组比较逻辑
- 查询历史记录管理
- `config_groups.db`: SQLite数据库存储用户保存的配置组和查询历史
- **分表查询功能(新增)**
- `ShardingCalculator`TWCS时间分表计算器
- `execute_sharding_query()`:分表查询执行
- `execute_mixed_query()`:混合查询支持(生产分表+测试单表组合)
- `/api/sharding-query`分表查询API端点
- `config_groups.db`: SQLite数据库存储用户保存的配置组、查询历史和分表配置
**前端 (原生JavaScript + Bootstrap)**
- `templates/db_compare.html`: 主界面模板,包含配置表单和结果展示
- `templates/db_compare.html`: 主界面模板,**现已支持单表和分表双模式**
- 分表模式切换开关
- 生产/测试环境独立分表配置
- 分表参数配置(时间间隔、分表数量)
- 分表查询信息展示
- `templates/index.html`: 工具集合首页
- `static/js/app.js`: 核心前端逻辑
- 配置管理和表单处理
- 差异结果的分页展示系统
- 原生数据展示(多种视图模式:格式化、原始、差异对比、树形)
- 高级错误处理和用户反馈
- **分表查询支持(新增)**
- `toggleShardingMode()`:分表模式切换
- `getShardingConfig()`:分表配置获取
- `displayShardingInfo()`:分表查询结果展示
**分表查询功能模块(重要新增)**
- **时间戳提取算法(已更新)**
- **新规则**:使用 `re.sub(r'\D', '', key)` 删除Key中所有非数字字符
- 将提取到的数字字符串转换为整数作为时间戳
- 支持任意格式的Key只要包含数字即可
- 示例:`wmid_1609459200``1609459200``abc123def456``123456`
- **分表索引计算**
- 公式:`int(numbers) // interval_seconds % table_count`
- 默认配置604800秒间隔7天14张分表
- 支持自定义配置
- **混合查询场景**
- 生产环境分表 + 测试环境单表
- 生产环境分表 + 测试环境分表
- 生产环境单表 + 测试环境分表
- 生产环境单表 + 测试环境单表
**示例代码**
- `demo/Query.py`: 独立的Cassandra查询比对脚本示例
- `demo/twcsQuery.py`: 另一个查询示例
- `demo/CalculationLibrary.py`: 分表计算逻辑参考实现
- `test_sharding.py`: 分表功能测试脚本
### 关键功能模块
@@ -46,6 +77,12 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
- 配置导入导出和管理
- 详细的错误诊断和故障排查指南
- 查询历史记录和复用
- **查询日志系统(新增)**
- 实时显示SQL执行日志
- 支持日志级别过滤INFO/WARNING/ERROR
- SQL语句语法高亮显示
- 执行时间和记录数统计
- 日志清空和刷新功能
## 开发相关命令
@@ -61,8 +98,34 @@ python app.py
# 修改app.py最后一行app.run(debug=True, port=5001)
```
### 测试和验证
```bash
# 运行分表功能测试(测试时间戳提取和分表索引计算)
python test_sharding.py
# 测试新的分表计算规则
python test_new_sharding.py
# 演示新分表规则的详细工作原理
python demo_new_sharding.py
# 测试查询日志功能
python test_query_logs.py
# 集成测试(分表功能 + 查询日志)
python test_integration.py
# 测试数据库连接和查询功能
# 通过Web界面http://localhost:5000/db-compare
# 或直接运行示例脚本:
python demo/Query.py
python demo/twcsQuery.py
```
### 开发模式
应用默认运行在debug模式代码修改后自动重启。访问 http://localhost:5000 查看首页http://localhost:5000/db-compare 使用比对工具。
应用默认运行在debug模式代码修改后自动重启。访问
- http://localhost:5000 - 工具集合首页
- http://localhost:5000/db-compare - 数据库比对工具
### 依赖项
- Flask==2.3.3
@@ -72,7 +135,8 @@ python app.py
### 核心API端点
- `GET /api/default-config`: 获取默认数据库配置
- `POST /api/query`: 执行数据库查询比对(主要功能)
- `POST /api/query`: 执行单表数据库查询比对(原有功能)
- `POST /api/sharding-query`: 执行分表查询比对(新增功能)
- `GET /api/config-groups`: 获取所有配置组
- `POST /api/config-groups`: 创建新配置组
- `GET /api/config-groups/<id>`: 获取特定配置组
@@ -82,17 +146,31 @@ python app.py
- `POST /api/query-history`: 保存查询历史
- `GET /api/query-history/<id>`: 获取特定历史记录
- `DELETE /api/query-history/<id>`: 删除历史记录
- `GET /api/query-logs`: 获取查询日志支持limit参数
- `DELETE /api/query-logs`: 清空查询日志
### 查询比对流程
**单表查询流程(`/api/query`**
1. 前端发送配置和Key值列表到 `/api/query`
2. 后端创建两个Cassandra连接生产+测试)
3. 并行执行查询,获取原始数据
4. 运行比较算法,生成差异报告
5. 返回完整结果(差异、统计、原始数据)
**分表查询流程(`/api/sharding-query`**
1. 前端发送配置、Key值列表和分表配置到 `/api/sharding-query`
2. 后端使用 `ShardingCalculator` 解析Key中的时间戳
3. 根据分表算法计算每个Key对应的分表名称
4. 创建分表映射关系,并行执行分表查询
5. 汇总所有分表结果,执行比较算法
6. 返回包含分表信息的完整结果
## 数据结构和配置
### 数据库配置结构
**单表查询配置**
```javascript
{
pro_config: {
@@ -107,6 +185,24 @@ python app.py
}
```
**分表查询配置**
```javascript
{
pro_config: { /* 基础配置同上 */ },
test_config: { /* 基础配置同上 */ },
keys: ["主键字段名"],
fields_to_compare: ["字段1", "字段2"],
exclude_fields: ["排除字段"],
values: ["key1", "key2", "key3"],
sharding_config: {
use_sharding_for_pro: true, // 生产环境是否使用分表
use_sharding_for_test: false, // 测试环境是否使用分表
interval_seconds: 604800, // 分表时间间隔默认7天
table_count: 14 // 分表数量默认14张表
}
}
```
### 查询结果结构
```javascript
{
@@ -115,12 +211,34 @@ python app.py
identical_results: [{ key, pro_fields, test_fields }],
field_diff_count: { "field_name": count },
raw_pro_data: [], raw_test_data: [],
summary: { overview, percentages, field_analysis, recommendations }
summary: { overview, percentages, field_analysis, recommendations },
// 分表查询特有字段
sharding_info: {
pro_shard_mapping: { "key1": "table_name_0", "key2": "table_name_1" },
test_shard_mapping: { /* 同上 */ },
failed_keys: [], // 时间戳提取失败的Key
shard_stats: {
pro_tables_used: ["table_0", "table_1"],
test_tables_used: ["table_0"],
timestamp_extraction_success_rate: 95.5
}
}
}
```
## 开发注意事项
### 分表功能开发指导
- **时间戳解析(已更新)**`ShardingCalculator.extract_timestamp_from_key()` 新规则
- 使用 `re.sub(r'\D', '', key)` 删除所有非数字字符
- 将提取的数字字符串转换为整数作为时间戳
- 不再进行时间戳有效性验证,支持任意数字组合
- **分表索引计算**:使用公式 `int(numbers) // interval_seconds % table_count`
- **错误处理**Key中没有数字字符时会记录到 `failed_keys`
- **混合查询**:支持生产环境分表+测试环境单表的组合场景
- **前端状态**:分表模式通过 `toggleShardingMode()` 切换影响UI和提示文本
### Cassandra连接处理
- 连接包含详细的错误诊断和重试机制
- 使用DCAwareRoundRobinPolicy避免负载均衡警告
@@ -133,6 +251,7 @@ python app.py
- `currentResults`: 存储最新查询结果
- 分页状态:`currentIdenticalPage`, `currentDifferencePage`
- 过滤状态:`filteredIdenticalResults`, `filteredDifferenceResults`
- **日志状态(新增)**`allQueryLogs` - 存储所有查询日志
### JSON和数组字段处理
- `normalize_json_string()`: 标准化JSON字符串用于比较
@@ -144,6 +263,7 @@ python app.py
- 后端分类错误connection_error, validation_error, query_error, system_error
- 前端:详细错误展示,包含配置信息、解决建议、连接测试工具
- 提供交互式故障排查指南
- **查询日志(新增)**所有SQL执行和错误信息都会记录到查询日志中
### 性能考虑
- 大数据集的分页处理
@@ -160,6 +280,7 @@ python app.py
- pro_config: 生产环境配置JSON
- test_config: 测试环境配置JSON
- query_config: 查询配置JSON
- **sharding_config: 分表配置JSON新增字段**
- created_at/updated_at: 时间戳
**query_history表**