增加Redis查询比对

This commit is contained in:
2025-08-04 09:14:27 +08:00
parent e1a566012d
commit 4c4d168471
18 changed files with 8007 additions and 2250 deletions

113
CLAUDE.md
View File

@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## 项目架构
这是一个基于 Flask 的数据库查询比对工具,用于比较 Cassandra 数据库中生产环境和测试环境的数据差异。现已支持单表查询TWCS分表查询两种模式
这是一个基于 Flask 的数据库查询比对工具,用于比较 Cassandra 数据库中生产环境和测试环境的数据差异。现已支持单表查询TWCS分表查询和**多主键查询**三种核心功能
### 核心组件架构
@@ -15,29 +15,38 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
- 配置组管理CRUD操作
- JSON字段特殊处理和数组比较逻辑
- 查询历史记录管理
- **分表查询功能(新增)**
- **分表查询功能**
- `ShardingCalculator`TWCS时间分表计算器
- `execute_sharding_query()`:分表查询执行
- `execute_mixed_query()`:混合查询支持(生产分表+测试单表组合)
- `/api/sharding-query`分表查询API端点
- **多主键查询功能(新增)**
- `execute_query()`函数支持复合主键SQL构建
- `compare_results()`函数支持复合主键匹配
- `match_composite_key()`辅助函数处理复合主键比较
- `config_groups.db`: SQLite数据库存储用户保存的配置组、查询历史和分表配置
**前端 (原生JavaScript + Bootstrap)**
- `templates/db_compare.html`: 主界面模板,**现已支持单表分表模式**
- `templates/db_compare.html`: 主界面模板,**现已支持单表分表和多主键三种模式**
- 分表模式切换开关
- 生产/测试环境独立分表配置
- 分表参数配置(时间间隔、分表数量)
- 分表查询信息展示
- **多主键查询支持**UI提示和占位符文本更新
- `templates/index.html`: 工具集合首页
- `static/js/app.js`: 核心前端逻辑
- 配置管理和表单处理
- 差异结果的分页展示系统
- 原生数据展示(多种视图模式:格式化、原始、差异对比、树形)
- 高级错误处理和用户反馈
- **分表查询支持(新增)**
- **分表查询支持**
- `toggleShardingMode()`:分表模式切换
- `getShardingConfig()`:分表配置获取
- `displayShardingInfo()`:分表查询结果展示
- **多主键查询支持(新增)**
- `getCurrentConfig()`函数解析复合主键配置
- `formatCompositeKey()`:复合主键显示格式化
- UI占位符和提示文本支持复合主键格式
**分表查询功能模块(重要新增)**
- **时间戳提取算法(已更新)**
@@ -55,6 +64,21 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
- 生产环境单表 + 测试环境分表
- 生产环境单表 + 测试环境单表
**多主键查询功能模块(最新功能)**
- **复合主键格式**
- 主键字段:逗号分隔,如 `docid,id`
- 查询值:逗号分隔,如 `8825C293B3609175B2224236E984FEDB,8825C293B3609175B2224236E984FED`
- 一行一组复合主键值
- **SQL构建逻辑**
- 单主键:`key IN (val1, val2, val3)`
- 复合主键:`(key1='val1' AND key2='val2') OR (key1='val3' AND key2='val4')`
- **数据匹配算法**
- `match_composite_key()`函数处理单主键和复合主键的统一匹配
- 支持字段数量验证和类型转换
- **向后兼容**
- 完全兼容现有单主键查询
- 自动识别主键类型并采用相应处理逻辑
**核心文件**
- `app.py`: 唯一的主应用文件,包含所有功能实现
- `config_groups.db`: SQLite数据库文件
@@ -67,6 +91,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
- 字段级别的差异统计和分析
- 数据质量评估和建议生成
- 支持包含和排除特定字段的比较
- **多主键数据比对**:支持复合主键的精确匹配和差异检测
**用户界面特性**
- 分页系统(差异记录和相同记录)
@@ -115,6 +140,12 @@ python app.py
# 单表查询测试http://localhost:5000/db-compare
# 分表查询测试在Web界面中开启分表模式
# 多主键查询测试示例:
# 1. 在主键字段中输入docid,id
# 2. 在查询Key值中输入每行一组
# 8825C293B3609175B2224236E984FEDB,8825C293B3609175B2224236E984FED
# 9925C293B3609175B2224236E984FEDB,9925C293B3609175B2224236E984FED
# 数据库初始化如果config_groups.db不存在
# 通过访问Web界面会自动创建数据库表结构
```
@@ -129,17 +160,18 @@ python app.py
- cassandra-driver==3.29.1
### 项目特点
- **单文件架构**:所有后端逻辑都在 `app.py` 中实现(1400+行代码)
- **内存日志系统**:使用 `QueryLogCollector` 类在内存中收集查询日志
- **SQLite本地存储**:配置组查询历史存储在本地 `config_groups.db` 文件中
- **单文件架构**:所有后端逻辑都在 `app.py` 中实现(2230+行代码)
- **内存+数据库日志系统**:使用 `QueryLogCollector` 类在内存和SQLite中收集查询日志
- **SQLite本地存储**:配置组查询历史和日志存储在本地 `config_groups.db` 文件中
- **前端原生实现**使用原生JavaScript + Bootstrap无现代前端框架
- **多模式支持**:单表查询、分表查询、多主键查询的统一架构
## API架构说明
### 核心API端点
- `GET /api/default-config`: 获取默认数据库配置
- `POST /api/query`: 执行单表数据库查询比对(原有功能
- `POST /api/sharding-query`: 执行分表查询比对(新增功能
- `POST /api/query`: 执行单表数据库查询比对(**支持多主键查询**
- `POST /api/sharding-query`: 执行分表查询比对(**支持多主键查询**
- `GET /api/config-groups`: 获取所有配置组
- `POST /api/config-groups`: 创建新配置组
- `GET /api/config-groups/<id>`: 获取特定配置组
@@ -148,8 +180,10 @@ python app.py
- `GET /api/query-history`: 获取查询历史
- `POST /api/query-history`: 保存查询历史
- `GET /api/query-history/<id>`: 获取特定历史记录
- `GET /api/query-history/<id>/results`: 获取历史记录的完整结果数据
- `DELETE /api/query-history/<id>`: 删除历史记录
- `GET /api/query-logs`: 获取查询日志支持limit参数
- `GET /api/query-logs/history/<id>`: 获取特定历史记录的相关日志
- `DELETE /api/query-logs`: 清空查询日志
### 查询比对流程
@@ -181,10 +215,10 @@ python app.py
username, password, keyspace, table
},
test_config: { /* 同上 */ },
keys: ["主键字段名"],
keys: ["主键字段名"], // 支持多个字段,如 ["docid", "id"]
fields_to_compare: ["字段1", "字段2"], // 空数组=全部字段
exclude_fields: ["排除字段"],
values: ["key1", "key2", "key3"] // 要查询的Key
values: ["key1", "key2", "key3"] // 单主键或复合主键
}
```
@@ -193,10 +227,10 @@ python app.py
{
pro_config: { /* 基础配置同上 */ },
test_config: { /* 基础配置同上 */ },
keys: ["主键字段名"],
keys: ["主键字段名"], // 支持复合主键
fields_to_compare: ["字段1", "字段2"],
exclude_fields: ["排除字段"],
values: ["key1", "key2", "key3"],
values: ["key1", "key2", "key3"], // 支持复合主键值
sharding_config: {
use_sharding_for_pro: true, // 生产环境是否使用分表
use_sharding_for_test: false, // 测试环境是否使用分表
@@ -206,12 +240,30 @@ python app.py
}
```
**多主键查询格式示例**
```javascript
// 复合主键配置
keys: ["docid", "id"]
// 复合主键查询值(逗号分隔)
values: [
"8825C293B3609175B2224236E984FEDB,8825C293B3609175B2224236E984FED",
"9925C293B3609175B2224236E984FEDB,9925C293B3609175B2224236E984FED"
]
```
### 查询结果结构
```javascript
{
total_keys, pro_count, test_count,
differences: [{ key, field, pro_value, test_value, message }],
identical_results: [{ key, pro_fields, test_fields }],
differences: [{
key: {docid: "val1", id: "val2"}, // 支持复合主键对象
field, pro_value, test_value, message
}],
identical_results: [{
key: {docid: "val1", id: "val2"}, // 支持复合主键对象
pro_fields, test_fields
}],
field_diff_count: { "field_name": count },
raw_pro_data: [], raw_test_data: [],
summary: { overview, percentages, field_analysis, recommendations },
@@ -239,10 +291,11 @@ python app.py
- **HTML模板**使用Jinja2模板引擎主要文件在 `templates/` 目录
### 核心类和函数位置app.py
- `QueryLogCollector`日志收集系统第20-46行
- `ShardingCalculator`类:分表计算器(第64行开始)
- 数据库连接:`create_cassandra_connection()`
- 查询比对:`execute_query()``execute_sharding_query()`
- `QueryLogCollector`日志收集系统第23-276行
- `ShardingCalculator`类:分表计算器(第291行开始)
- 数据库连接:`create_connection()` (第1072行)
- 查询比对:`execute_query()` (第1177行)`execute_sharding_query()` (第1250行)
- **多主键支持**`match_composite_key()` (第1407行)
- API路由使用Flask装饰器定义
### 分表功能开发指导
@@ -255,6 +308,13 @@ python app.py
- **混合查询**:支持生产环境分表+测试环境单表的组合场景
- **前端状态**:分表模式通过 `toggleShardingMode()` 切换影响UI和提示文本
### 多主键功能开发指导
- **主键解析**:前端通过逗号分隔解析主键字段和值
- **SQL构建**:后端 `execute_query()` 根据主键数量选择不同的WHERE条件构建策略
- **数据匹配**`match_composite_key()` 函数统一处理单主键和复合主键匹配逻辑
- **UI适配**:占位符和提示文本根据模式动态更新
- **结果展示**:支持复合主键对象格式的显示和格式化
### Cassandra连接处理
- 连接包含详细的错误诊断和重试机制
- 使用DCAwareRoundRobinPolicy避免负载均衡警告
@@ -308,4 +368,17 @@ python app.py
- results_summary: 结果摘要JSON
- execution_time: 执行时间
- total_keys/differences_count/identical_count: 统计数据
- created_at: 时间戳
- **sharding_config: 分表配置JSON新增字段**
- **query_type: 查询类型('single'/'sharding',新增字段)**
- **raw_results/differences_data/identical_data: 查询结果数据(新增字段)**
- created_at: 时间戳
**query_logs表新增表**
- id: 主键
- batch_id: 批次ID
- **history_id: 关联历史记录ID外键**
- timestamp: 时间戳
- level: 日志级别INFO/WARNING/ERROR
- message: 日志消息
- query_type: 查询类型
- created_at: 创建时间