Files
BigDataTool/CLAUDE.md
2025-08-04 09:14:27 +08:00

384 lines
15 KiB
Markdown
Raw 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.

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 项目架构
这是一个基于 Flask 的数据库查询比对工具,用于比较 Cassandra 数据库中生产环境和测试环境的数据差异。现已支持单表查询、TWCS分表查询和**多主键查询**三种核心功能。
### 核心组件架构
**后端 (Flask)**
- `app.py`: 主应用文件包含所有API端点和数据处理逻辑
- 数据库连接管理Cassandra + SQLite
- 查询执行和结果比对算法
- 配置组管理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`: 主界面模板,**现已支持单表、分表和多主键三种模式**
- 分表模式切换开关
- 生产/测试环境独立分表配置
- 分表参数配置(时间间隔、分表数量)
- 分表查询信息展示
- **多主键查询支持**UI提示和占位符文本更新
- `templates/index.html`: 工具集合首页
- `static/js/app.js`: 核心前端逻辑
- 配置管理和表单处理
- 差异结果的分页展示系统
- 原生数据展示(多种视图模式:格式化、原始、差异对比、树形)
- 高级错误处理和用户反馈
- **分表查询支持**
- `toggleShardingMode()`:分表模式切换
- `getShardingConfig()`:分表配置获取
- `displayShardingInfo()`:分表查询结果展示
- **多主键查询支持(新增)**
- `getCurrentConfig()`函数解析复合主键配置
- `formatCompositeKey()`:复合主键显示格式化
- UI占位符和提示文本支持复合主键格式
**分表查询功能模块(重要新增)**
- **时间戳提取算法(已更新)**
- **新规则**:使用 `re.sub(r'\D', '', key)` 删除Key中所有非数字字符
- 将提取到的数字字符串转换为整数作为时间戳
- 支持任意格式的Key只要包含数字即可
- 示例:`wmid_1609459200``1609459200``abc123def456``123456`
- **分表索引计算**
- 公式:`int(numbers) // interval_seconds % table_count`
- 默认配置604800秒间隔7天14张分表
- 支持自定义配置
- **混合查询场景**
- 生产环境分表 + 测试环境单表
- 生产环境分表 + 测试环境分表
- 生产环境单表 + 测试环境分表
- 生产环境单表 + 测试环境单表
**多主键查询功能模块(最新功能)**
- **复合主键格式**
- 主键字段:逗号分隔,如 `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数据库文件
### 关键功能模块
**数据比对引擎**
- 支持复杂JSON字段的深度比较
- 数组字段的顺序无关比较
- 字段级别的差异统计和分析
- 数据质量评估和建议生成
- 支持包含和排除特定字段的比较
- **多主键数据比对**:支持复合主键的精确匹配和差异检测
**用户界面特性**
- 分页系统(差异记录和相同记录)
- 实时搜索和过滤
- 原生数据展示JSON语法高亮、树形视图
- 配置导入导出和管理
- 详细的错误诊断和故障排查指南
- 查询历史记录和复用
- **查询日志系统(新增)**
- 实时显示SQL执行日志
- 支持日志级别过滤INFO/WARNING/ERROR
- SQL语句语法高亮显示
- 执行时间和记录数统计
- 日志清空和刷新功能
## 开发相关命令
### 环境设置
```bash
# 安装依赖
pip install -r requirements.txt
# 运行应用默认端口5000
python app.py
# 自定义端口运行
# 修改app.py最后一行app.run(debug=True, port=XXXX)
# 生产环境运行
# python app.py 或使用WSGI服务器如gunicorn
```
### 调试和日志
```bash
# 应用启动后查询日志可通过以下API获取
# GET /api/query-logs - 获取查询日志
# DELETE /api/query-logs - 清空查询日志
# 日志级别INFO, WARNING, ERROR
# 所有Cassandra查询和SQL操作都会记录到查询日志中
```
### 测试和验证
```bash
# 主要通过Web界面进行功能测试
# 单表查询测试http://localhost:5000/db-compare
# 分表查询测试在Web界面中开启分表模式
# 多主键查询测试示例:
# 1. 在主键字段中输入docid,id
# 2. 在查询Key值中输入每行一组
# 8825C293B3609175B2224236E984FEDB,8825C293B3609175B2224236E984FED
# 9925C293B3609175B2224236E984FEDB,9925C293B3609175B2224236E984FED
# 数据库初始化如果config_groups.db不存在
# 通过访问Web界面会自动创建数据库表结构
```
### 开发模式
应用默认运行在debug模式代码修改后自动重启。访问
- http://localhost:5000 - 工具集合首页
- http://localhost:5000/db-compare - 数据库比对工具
### 依赖项
- Flask==2.3.3
- cassandra-driver==3.29.1
### 项目特点
- **单文件架构**:所有后端逻辑都在 `app.py` 中实现2230+行代码)
- **内存+数据库日志系统**:使用 `QueryLogCollector` 类在内存和SQLite中收集查询日志
- **SQLite本地存储**:配置组、查询历史和日志存储在本地 `config_groups.db` 文件中
- **前端原生实现**使用原生JavaScript + Bootstrap无现代前端框架
- **多模式支持**:单表查询、分表查询、多主键查询的统一架构
## API架构说明
### 核心API端点
- `GET /api/default-config`: 获取默认数据库配置
- `POST /api/query`: 执行单表数据库查询比对(**支持多主键查询**
- `POST /api/sharding-query`: 执行分表查询比对(**支持多主键查询**
- `GET /api/config-groups`: 获取所有配置组
- `POST /api/config-groups`: 创建新配置组
- `GET /api/config-groups/<id>`: 获取特定配置组
- `DELETE /api/config-groups/<id>`: 删除配置组
- `POST /api/init-db`: 初始化SQLite数据库
- `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`: 清空查询日志
### 查询比对流程
**单表查询流程(`/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: {
cluster_name, datacenter, hosts[], port,
username, password, keyspace, table
},
test_config: { /* 同上 */ },
keys: ["主键字段名"], // 支持多个字段,如 ["docid", "id"]
fields_to_compare: ["字段1", "字段2"], // 空数组=全部字段
exclude_fields: ["排除字段"],
values: ["key1", "key2", "key3"] // 单主键或复合主键值
}
```
**分表查询配置**
```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
// 复合主键配置
keys: ["docid", "id"]
// 复合主键查询值(逗号分隔)
values: [
"8825C293B3609175B2224236E984FEDB,8825C293B3609175B2224236E984FED",
"9925C293B3609175B2224236E984FEDB,9925C293B3609175B2224236E984FED"
]
```
### 查询结果结构
```javascript
{
total_keys, pro_count, test_count,
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 },
// 分表查询特有字段
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
}
}
}
```
## 开发注意事项
### 代码修改指导
- **单文件开发**:所有后端功能都在 `app.py` 中,修改时要注意代码结构清晰
- **数据库模式变更**修改SQLite表结构需要考虑向后兼容性
- **前端JavaScript**:位于 `static/js/app.js`使用原生JS注意浏览器兼容性
- **HTML模板**使用Jinja2模板引擎主要文件在 `templates/` 目录
### 核心类和函数位置app.py
- `QueryLogCollector`日志收集系统第23-276行
- `ShardingCalculator`分表计算器第291行开始
- 数据库连接:`create_connection()` (第1072行)
- 查询比对:`execute_query()` (第1177行) 和 `execute_sharding_query()` (第1250行)
- **多主键支持**`match_composite_key()` (第1407行)
- API路由使用Flask装饰器定义
### 分表功能开发指导
- **时间戳解析(已更新)**`ShardingCalculator.extract_timestamp_from_key()` 新规则
- 使用 `re.sub(r'\D', '', key)` 删除所有非数字字符
- 将提取的数字字符串转换为整数作为时间戳
- 不再进行时间戳有效性验证,支持任意数字组合
- **分表索引计算**:使用公式 `int(numbers) // interval_seconds % table_count`
- **错误处理**Key中没有数字字符时会记录到 `failed_keys`
- **混合查询**:支持生产环境分表+测试环境单表的组合场景
- **前端状态**:分表模式通过 `toggleShardingMode()` 切换影响UI和提示文本
### 多主键功能开发指导
- **主键解析**:前端通过逗号分隔解析主键字段和值
- **SQL构建**:后端 `execute_query()` 根据主键数量选择不同的WHERE条件构建策略
- **数据匹配**`match_composite_key()` 函数统一处理单主键和复合主键匹配逻辑
- **UI适配**:占位符和提示文本根据模式动态更新
- **结果展示**:支持复合主键对象格式的显示和格式化
### Cassandra连接处理
- 连接包含详细的错误诊断和重试机制
- 使用DCAwareRoundRobinPolicy避免负载均衡警告
- 连接超时设置为10秒
- 失败时提供网络连通性测试
- 支持认证PlainTextAuthProvider
- 支持集群配置cluster_name, datacenter
### 前端状态管理
- `currentResults`: 存储最新查询结果
- 分页状态:`currentIdenticalPage`, `currentDifferencePage`
- 过滤状态:`filteredIdenticalResults`, `filteredDifferenceResults`
- **日志状态(新增)**`allQueryLogs` - 存储所有查询日志
### JSON和数组字段处理
- `normalize_json_string()`: 标准化JSON字符串用于比较
- `compare_array_values()`: 数组的顺序无关比较
- `is_json_field()`: 智能检测JSON字段
- 前端提供专门的JSON语法高亮和树形展示
### 错误处理策略
- 后端分类错误connection_error, validation_error, query_error, system_error
- 前端:详细错误展示,包含配置信息、解决建议、连接测试工具
- 提供交互式故障排查指南
- **查询日志(新增)**所有SQL执行和错误信息都会记录到查询日志中
### 性能考虑
- 大数据集的分页处理
- 原生数据的延迟加载
- JSON格式化的客户端缓存
- 搜索和过滤的防抖处理
### SQLite数据库表结构
**config_groups表**
- id: 主键
- name: 配置组名称(唯一)
- description: 描述
- pro_config: 生产环境配置JSON
- test_config: 测试环境配置JSON
- query_config: 查询配置JSON
- **sharding_config: 分表配置JSON新增字段**
- created_at/updated_at: 时间戳
**query_history表**
- id: 主键
- name: 查询名称
- description: 描述
- pro_config/test_config/query_config: 配置JSON
- query_keys: 查询的键值JSON
- results_summary: 结果摘要JSON
- execution_time: 执行时间
- total_keys/differences_count/identical_count: 统计数据
- **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: 创建时间