You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python WebSocket实时数据更新SQL:简化逻辑及映射报错解决

问题解决方案

1. 修复ValueError: too many values to unpack (expected 2)错误

这个错误的直接原因是遍历字典时未获取键值对:Python中直接遍历字典(for k, v in field_map)只会拿到字典的键,每个元素是单个字符串,无法拆分成k和v两个变量。

修正方法:使用字典的items()方法遍历键值对,修改字典推导式的遍历部分:

item_data = {
    v: data["Fields"][k]
    for k, v in field_map.items()  # 新增.items()获取键值对
    if k in data["Fields"]
}

2. 避免大量if/elif处理SQL更新的方案

你采用的字段映射+动态生成SQL的思路完全可行,修正遍历问题后,就能自动适配所有字段变更组合,无需编写分支判断。核心逻辑如下:

  • 用field_map维护数据源字段与数据库字段的映射关系
  • 从推送的JSON中筛选存在的字段,映射为数据库字段名
  • 动态拼接SQL的SET子句,通过参数化方式避免SQL注入
  • 按顺序整理参数值,执行数据库更新

修正后的完整代码

import datetime

# 数据源字段与数据库字段的映射表
field_map = {
    'TRDPRC_1': 'NominalPrice',
    'NETCHNG_1': 'Net_Change',
    'PCTCHNG': 'Percent_Change',
    'TURNOVER': 'TurnOver',
    'ACVOL_1': 'SharesTrades',
    'ASK': 'Ask_Price',
    'BID': 'Bid_Price',
    'LOT_SIZE': 'LotSize',
    'HIGH_1': 'Today_Highest',
    'LOW_1': 'Today_Lowest',
    'DSPLY_NAME': 'English_Name',
    'DSPLY_NMLL': 'Chinese_Name',
    'PERATIO': 'PERatio',
    'DIVIDEND': 'Dividend',
    '52WK_HIGH': 'Year_Highest',
    '52WK_LOW': 'Year_Lowest'
}

# 处理实时推送数据的函数
def process_data(data):
    # 筛选推送数据中存在的字段,映射为数据库字段
    item_data = {
        db_field: data["Fields"][src_field]
        for src_field, db_field in field_map.items()
        if src_field in data["Fields"]
    }
    
    if not item_data:
        return  # 无变更字段,跳过更新
    
    # 动态生成SQL更新语句
    update_fields = list(item_data.keys())
    update_clause = ', '.join(f"{field}=?" for field in update_fields)
    cmd = f"UPDATE myTable SET {update_clause}, ReutersDate=? WHERE Stock_Code=?"
    
    # 整理参数值:先变更字段值,再更新时间,最后股票代码
    cmd_data = list(item_data.values())
    cmd_data.append(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    stock_code = data['Key']['Name'].lstrip('0').rstrip('.HK')
    cmd_data.append(stock_code)
    
    # 执行SQL并提交
    print(cmd)
    print(cmd_data)
    cur2.execute(cmd, cmd_data)
    conn2.commit()

关键优势

  • 无需编写任何if/elif分支,新增或修改字段只需更新field_map字典
  • 参数化SQL有效避免SQL注入风险
  • 自动兼容全量数据推送和增量变更推送两种场景

内容的提问来源于stack exchange,提问作者Toby wkw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:53:20