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
相关产品推荐
相关产品推荐

