""" 测试 API 响应,检查是否有 bytes 序列化问题 """ import pymysql import os import json from dotenv import load_dotenv load_dotenv() # 数据库连接配置 DB_CONFIG = { 'host': os.getenv('DB_HOST', '152.136.177.240'), 'port': int(os.getenv('DB_PORT', 5012)), 'user': os.getenv('DB_USER', 'finyx'), 'password': os.getenv('DB_PASSWORD', '6QsGK6MpePZDE57Z'), 'database': os.getenv('DB_NAME', 'finyx'), 'charset': 'utf8mb4' } def clean_query_result(data): """ 清理查询结果,将 bytes 类型转换为字符串 用于处理数据库查询结果中的 BLOB 等字段 """ if isinstance(data, bytes): try: return data.decode('utf-8') except UnicodeDecodeError: return data.decode('utf-8', errors='ignore') elif isinstance(data, dict): return {key: clean_query_result(value) for key, value in data.items()} elif isinstance(data, list): return [clean_query_result(item) for item in data] elif isinstance(data, (int, float, str, bool, type(None))): return data else: # 对于其他类型(如 Decimal, datetime),转换为字符串 try: return str(data) except: return data def test_field_query(): """测试字段查询""" conn = pymysql.connect(**DB_CONFIG) cursor = conn.cursor(pymysql.cursors.DictCursor) try: tenant_id = 615873064429507639 print("测试查询字段...") cursor.execute(""" SELECT id, name, filed_code, field_type, state FROM f_polic_field WHERE tenant_id = %s ORDER BY field_type, name LIMIT 5 """, (tenant_id,)) fields = cursor.fetchall() print(f"查询到 {len(fields)} 条记录") # 检查数据类型 if fields: print("\n第一条记录的原始数据:") first_field = fields[0] for key, value in first_field.items(): print(f" {key}: {type(value).__name__} = {repr(value)}") # 清理数据 cleaned_fields = [clean_query_result(field) for field in fields] print("\n清理后的第一条记录:") first_cleaned = cleaned_fields[0] for key, value in first_cleaned.items(): print(f" {key}: {type(value).__name__} = {repr(value)}") # 测试 JSON 序列化 print("\n测试 JSON 序列化...") try: json_str = json.dumps(cleaned_fields, ensure_ascii=False, indent=2, default=str) print("✓ JSON 序列化成功") print(f"JSON 长度: {len(json_str)} 字符") except Exception as e: print(f"✗ JSON 序列化失败: {e}") print(f"错误类型: {type(e).__name__}") finally: cursor.close() conn.close() if __name__ == '__main__': test_field_query()