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

15 KiB
Raw Blame History

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字段特殊处理和数组比较逻辑
    • 查询历史记录管理
    • 分表查询功能
      • ShardingCalculatorTWCS时间分表计算器
      • 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_16094592001609459200abc123def456123456
  • 分表索引计算
    • 公式: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语句语法高亮显示
    • 执行时间和记录数统计
    • 日志清空和刷新功能

开发相关命令

环境设置

# 安装依赖
pip install -r requirements.txt

# 运行应用默认端口5000
python app.py

# 自定义端口运行
# 修改app.py最后一行app.run(debug=True, port=XXXX)

# 生产环境运行
# python app.py 或使用WSGI服务器如gunicorn

调试和日志

# 应用启动后查询日志可通过以下API获取
# GET /api/query-logs - 获取查询日志
# DELETE /api/query-logs - 清空查询日志

# 日志级别INFO, WARNING, ERROR
# 所有Cassandra查询和SQL操作都会记录到查询日志中

测试和验证

# 主要通过Web界面进行功能测试
# 单表查询测试http://localhost:5000/db-compare
# 分表查询测试在Web界面中开启分表模式

# 多主键查询测试示例:
# 1. 在主键字段中输入docid,id
# 2. 在查询Key值中输入每行一组
#    8825C293B3609175B2224236E984FEDB,8825C293B3609175B2224236E984FED
#    9925C293B3609175B2224236E984FEDB,9925C293B3609175B2224236E984FED

# 数据库初始化如果config_groups.db不存在
# 通过访问Web界面会自动创建数据库表结构

开发模式

应用默认运行在debug模式代码修改后自动重启。访问

依赖项

  • 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. 返回包含分表信息的完整结果

数据结构和配置

数据库配置结构

单表查询配置

{
  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"] // 单主键或复合主键值
}

分表查询配置

{
  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张表
  }
}

多主键查询格式示例

// 复合主键配置
keys: ["docid", "id"]

// 复合主键查询值(逗号分隔)
values: [
  "8825C293B3609175B2224236E984FEDB,8825C293B3609175B2224236E984FED",
  "9925C293B3609175B2224236E984FEDB,9925C293B3609175B2224236E984FED"
]

查询结果结构

{
  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: 创建时间