#!/usr/bin/env python # -*- coding: utf-8 -*- """ 测试 SQL Server 的插入/更新逻辑(基于 order_no + start_time + end_time) """ from sqlserver_writer import SQLServerWriter from datetime import datetime import json def test_upsert_logic(): """测试插入和更新逻辑""" print("=" * 80) print("测试 SQL Server 插入/更新逻辑") print("=" * 80) # 从配置文件加载 from pathlib import Path config_file = Path(__file__).parent / 'work_order_db_config.json' if not config_file.exists(): print(f"❌ 配置文件不存在: {config_file}") return False with open(config_file, 'r', encoding='utf-8') as f: db_config = json.load(f) # 检查是否为调试模式 if db_config.get('debug_mode', False): print("⚠️ 当前为调试模式,跳过实际数据库操作") print(" 请在 work_order_db_config.json 中设置 'debug_mode': false") return False config = { 'host': db_config.get('host', 'localhost'), 'port': db_config.get('port', 1433), 'database': db_config.get('database', ''), 'username': db_config.get('username', ''), 'password': db_config.get('password', ''), } print(f"使用配置: host={config['host']}, database={config['database']}") # 准备测试数据 test_order_no = 'TEST_UPSERT_' + datetime.now().strftime('%Y%m%d_%H%M%S') test_start_time = '2025-12-10 10:00:00' test_end_time = '2025-12-10 13:30:00' test_data_v1 = { 'order_no': test_order_no, 'start_time': test_start_time, 'end_time': test_end_time, 'ambient_temp_c': 25.0, 'temp_main_1_t05': 45.0, 'temp_main_1_t10': 48.0, 'remarks': '第一次插入' } test_data_v2 = { 'order_no': test_order_no, 'start_time': test_start_time, 'end_time': test_end_time, 'ambient_temp_c': 26.5, # 修改了环境温度 'temp_main_1_t05': 46.0, # 修改了温度 'temp_main_1_t10': 49.0, 'remarks': '第二次更新' } writer = SQLServerWriter(config) if not writer.connect(): print("❌ 无法连接到数据库") return False try: # 测试1: 第一次插入 print("\n" + "-" * 80) print("测试1: 第一次插入数据") print("-" * 80) print(f"工单号: {test_order_no}") print(f"开始时间: {test_start_time}") print(f"结束时间: {test_end_time}") print(f"环境温度: {test_data_v1['ambient_temp_c']}°C") print(f"备注: {test_data_v1['remarks']}") success1 = writer.write_pump_600_data(test_data_v1) if success1: print("✅ 第一次插入成功") else: print("❌ 第一次插入失败") return False # 测试2: 使用相同的 order_no + start_time + end_time 再次写入(应该更新) print("\n" + "-" * 80) print("测试2: 使用相同的 order_no + start_time + end_time 再次写入") print("-" * 80) print(f"工单号: {test_order_no} (相同)") print(f"开始时间: {test_start_time} (相同)") print(f"结束时间: {test_end_time} (相同)") print(f"环境温度: {test_data_v2['ambient_temp_c']}°C (已修改)") print(f"备注: {test_data_v2['remarks']} (已修改)") success2 = writer.write_pump_600_data(test_data_v2) if success2: print("✅ 第二次写入成功(应该是更新操作)") else: print("❌ 第二次写入失败") return False # 验证数据 print("\n" + "-" * 80) print("验证: 查询数据库中的记录") print("-" * 80) cursor = writer.connection.cursor() cursor.execute( """SELECT order_no, start_time, end_time, ambient_temp_c, remarks, created_at, updated_at FROM pump_600_no_load_run_in WHERE order_no = ? AND start_time = ? AND end_time = ?""", (test_order_no, test_start_time, test_end_time) ) rows = cursor.fetchall() if len(rows) == 0: print("❌ 未找到记录") return False elif len(rows) > 1: print(f"⚠️ 找到 {len(rows)} 条记录(应该只有1条)") else: print(f"✅ 找到 1 条记录") for row in rows: print(f"\n记录详情:") print(f" 工单号: {row[0]}") print(f" 开始时间: {row[1]}") print(f" 结束时间: {row[2]}") print(f" 环境温度: {row[3]}°C") print(f" 备注: {row[4]}") print(f" 创建时间: {row[5]}") print(f" 更新时间: {row[6]}") # 验证数据是否为更新后的值 if row[3] == test_data_v2['ambient_temp_c'] and row[4] == test_data_v2['remarks']: print("\n✅ 数据已正确更新为第二次写入的值") else: print("\n❌ 数据未正确更新") return False print("\n" + "=" * 80) print("测试完成") print("=" * 80) print("\n总结:") print(" ✅ 第一次插入: 成功") print(" ✅ 第二次更新: 成功") print(" ✅ 数据验证: 通过") print("\n逻辑验证:") print(" ✅ 相同的 order_no + start_time + end_time 会触发更新而不是插入") print(" ✅ 不会产生重复记录") return True except Exception as e: print(f"\n❌ 测试过程中出错: {e}") import traceback traceback.print_exc() return False finally: writer.disconnect() if __name__ == "__main__": test_upsert_logic()