diff --git a/app.py b/app.py index 3d644a6..e453ffa 100644 --- a/app.py +++ b/app.py @@ -906,9 +906,11 @@ def execute_mixed_query(pro_session, test_session, pro_config, test_config, keys # 处理生产环境查询 if sharding_config.get('use_sharding_for_pro', False): + # 获取生产环境分表配置参数,优先使用专用参数,否则使用通用参数 + pro_interval = sharding_config.get('pro_interval_seconds') or sharding_config.get('interval_seconds', 604800) + pro_table_count = sharding_config.get('pro_table_count') or sharding_config.get('table_count', 14) + # 记录生产环境分表配置信息 - pro_interval = sharding_config.get('pro_interval_seconds', 604800) - pro_table_count = sharding_config.get('pro_table_count', 14) logger.info(f"=== 生产环境分表配置 ===") logger.info(f"启用分表查询: True") logger.info(f"时间间隔: {pro_interval}秒 ({pro_interval//86400}天)") @@ -954,9 +956,11 @@ def execute_mixed_query(pro_session, test_session, pro_config, test_config, keys # 处理测试环境查询 if sharding_config.get('use_sharding_for_test', False): + # 获取测试环境分表配置参数,优先使用专用参数,否则使用通用参数 + test_interval = sharding_config.get('test_interval_seconds') or sharding_config.get('interval_seconds', 604800) + test_table_count = sharding_config.get('test_table_count') or sharding_config.get('table_count', 14) + # 记录测试环境分表配置信息 - test_interval = sharding_config.get('test_interval_seconds', 604800) - test_table_count = sharding_config.get('test_table_count', 14) logger.info(f"=== 测试环境分表配置 ===") logger.info(f"启用分表查询: True") logger.info(f"时间间隔: {test_interval}秒 ({test_interval//86400}天)") @@ -980,8 +984,8 @@ def execute_mixed_query(pro_session, test_session, pro_config, test_config, keys results['test_data'] = test_data results['sharding_info']['test_shards'] = { 'enabled': True, - 'interval_seconds': sharding_config.get('test_interval_seconds', 604800), - 'table_count': sharding_config.get('test_table_count', 14), + 'interval_seconds': test_interval, + 'table_count': test_table_count, 'queried_tables': test_queried_tables, 'error_tables': test_error_tables, 'failed_keys': test_failed_keys @@ -1214,7 +1218,16 @@ def sharding_query_compare(): logger.info(f" values数量: {len(values)}") logger.info(f" fields_to_compare: {fields_to_compare}") logger.info(f" exclude_fields: {exclude_fields}") - logger.info(f" sharding_config: {sharding_config}") + logger.info(f" sharding_config原始数据: {sharding_config}") + logger.info(f" sharding_config具体参数:") + logger.info(f" use_sharding_for_pro: {sharding_config.get('use_sharding_for_pro')}") + logger.info(f" use_sharding_for_test: {sharding_config.get('use_sharding_for_test')}") + logger.info(f" pro_interval_seconds: {sharding_config.get('pro_interval_seconds')}") + logger.info(f" pro_table_count: {sharding_config.get('pro_table_count')}") + logger.info(f" test_interval_seconds: {sharding_config.get('test_interval_seconds')}") + logger.info(f" test_table_count: {sharding_config.get('test_table_count')}") + logger.info(f" interval_seconds: {sharding_config.get('interval_seconds')}") + logger.info(f" table_count: {sharding_config.get('table_count')}") logger.info(f"分表查询配置:{len(values)}个key值,生产表:{pro_config['table']},测试表:{test_config['table']}") diff --git a/static/js/app.js b/static/js/app.js index bbe0014..3d10ba7 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -718,6 +718,13 @@ function getShardingConfig() { enabled: document.getElementById('enableSharding').checked, use_sharding_for_pro: document.getElementById('use_sharding_for_pro').checked, use_sharding_for_test: document.getElementById('use_sharding_for_test').checked, + // 生产环境分表参数 + pro_interval_seconds: parseInt(document.getElementById('pro_interval_seconds').value) || 604800, + pro_table_count: parseInt(document.getElementById('pro_table_count').value) || 14, + // 测试环境分表参数 + test_interval_seconds: parseInt(document.getElementById('test_interval_seconds').value) || 604800, + test_table_count: parseInt(document.getElementById('test_table_count').value) || 14, + // 保持向后兼容的通用参数 interval_seconds: parseInt(document.getElementById('pro_interval_seconds').value) || 604800, table_count: parseInt(document.getElementById('pro_table_count').value) || 14 } @@ -736,6 +743,11 @@ function displayResults(results) { document.getElementById('diff-count').textContent = results.differences.length; document.getElementById('identical-count').textContent = results.identical_results.length; + // 计算原始数据总数 + const totalRawData = (results.raw_pro_data ? results.raw_pro_data.length : 0) + + (results.raw_test_data ? results.raw_test_data.length : 0); + document.getElementById('rawdata-count').textContent = totalRawData; + // 初始化相同结果分页数据 filteredIdenticalResults = results.identical_results; currentIdenticalPage = 1; @@ -747,6 +759,7 @@ function displayResults(results) { // 显示各个面板内容 displayDifferences(); displayIdenticalResults(); + displayRawData(results); displayComparisonSummary(results.summary); // 显示结果区域 @@ -3202,4 +3215,353 @@ function autoRefreshLogsAfterQuery() { setTimeout(() => { refreshQueryLogs(); }, 500); +} + +// 原始数据相关变量 +let currentRawData = null; +let filteredRawData = []; +let currentRawDataPage = 1; +let rawDataPageSize = 20; + +// 显示原始数据 +function displayRawData(results) { + currentRawData = results; + + // 添加调试信息 + console.log('displayRawData - results.query_config:', results.query_config); + console.log('displayRawData - 当前数据键:', Object.keys(results)); + + // 合并生产和测试环境数据 + const combinedData = []; + + if (results.raw_pro_data) { + results.raw_pro_data.forEach(record => { + combinedData.push({ + environment: 'production', + data: record, + displayName: '生产环境' + }); + }); + } + + if (results.raw_test_data) { + results.raw_test_data.forEach(record => { + combinedData.push({ + environment: 'test', + data: record, + displayName: '测试环境' + }); + }); + } + + // 按环境排序,生产环境在前 + combinedData.sort((a, b) => { + if (a.environment === 'production' && b.environment === 'test') return -1; + if (a.environment === 'test' && b.environment === 'production') return 1; + return 0; + }); + + filteredRawData = combinedData; + currentRawDataPage = 1; + renderRawDataContent(); +} + +// 渲染原始数据内容 +function renderRawDataContent() { + const container = document.getElementById('raw-data-content'); + + if (!filteredRawData.length) { + container.innerHTML = '
主键: ${keyValue}
+${escapeHtml(jsonData)}+