JSON数据转SQLlite批量插入优化方案技术问询
更灵活的JSON数据批量插入SQLite方案
你当前的硬编码插入方式在字段少的时候确实好用,但随着后续字段增多,这种写法会变得繁琐且难以维护。我给你两个更优雅的实现思路,彻底告别重复代码:
方案1:自动匹配表字段与JSON键(推荐)
如果你的SQLite表Subskribe的字段名和返回的JSON键完全对应,用这个方法可以自动适配所有字段,后续新增字段完全不用改代码:
import json import sqlite3 # 假设已初始化数据库连接conn和游标c dane = json.loads(ws.recv()) # 先获取表的所有字段名,避免插入不存在的字段导致报错 c.execute("PRAGMA table_info(Subskribe)") table_columns = [col[1] for col in c.fetchall()] # 筛选出JSON中存在且属于表字段的键值对 valid_entries = {key: value for key, value in dane.items() if key in table_columns} if valid_entries: # 动态生成字段列表和占位符 column_names = ", ".join(valid_entries.keys()) placeholders = ", ".join(["?"] * len(valid_entries)) # 构造插入SQL insert_query = f"INSERT INTO Subskribe({column_names}) VALUES ({placeholders})" # 执行插入,传入值的元组 c.execute(insert_query, tuple(valid_entries.values())) conn.commit()
这个方法的优势在于完全解耦了字段数量和代码逻辑,只要表结构和JSON字段同步,代码永远不用调整,还能自动过滤JSON里的冗余字段。
方案2:自定义字段映射(适配键名不一致场景)
如果JSON中的键名和表字段名不匹配,或者你只需要插入部分字段,可以通过定义映射表来实现灵活控制:
import json import sqlite3 # 定义表字段与JSON键的映射关系,新增字段直接在这里追加 field_mapping = { "type": "type", "side": "side", "order_id": "order_id", # 示例:表字段price对应JSON里的order_price "price": "order_price", "quantity": "qty" } dane = json.loads(ws.recv()) # 收集需要插入的字段和对应值,不存在的字段默认设为None target_columns = [] insert_values = [] for table_field, json_key in field_mapping.items(): target_columns.append(table_field) insert_values.append(dane.get(json_key, None)) # 构造并执行插入语句 column_str = ", ".join(target_columns) placeholder_str = ", ".join(["?"] * len(target_columns)) insert_query = f"INSERT INTO Subskribe({column_str}) VALUES ({placeholder_str})" c.execute(insert_query, insert_values) conn.commit()
这种方式更适合有字段映射需求的场景,后续新增字段只需要在field_mapping里加一行即可,逻辑清晰易维护。
关于你提到的嵌套循环
其实完全没必要用嵌套循环来实现,这种写法会让代码逻辑变得混乱且难以调试。上面两种方法都是利用Python的字典和字符串拼接特性,动态生成SQL语句,比索引循环要高效且易读得多。
内容的提问来源于stack exchange,提问作者TRV




