Python将字典数据插入SQL数据库表的最简实现方法
问题场景
我有一个包含如下键值对的字典:
my_dict = {'a':33, 'b': 'something', 'c': GETDATE(), 'd': 55}
假设SQL表的列名与字典的键名完全一致,即列名为a,b,c,d,实际使用的字典包含20组以上的键值对。
现有实现问题
我已通过pyodbc.connect创建了可执行SQL INSERT语句的cursor游标对象,当前编写的插入代码如下:
for k in my_dict.keys(): cursor.execute( ''' INSERT INTO TABLEabc (%s) VALUES (%s) ''' % (k, my_dict[k]) )
注:该实现除了每次循环执行独立SQL、效率极低的问题外,字符串拼接构造SQL的写法还存在SQL注入风险,不推荐使用。
目前需要解决两个问题:
- 若使用循环实现插入,最简单的编写方式是什么?
- 如何编写代码实现单条INSERT语句一次性插入所有字典值?
解决方案
1. 循环插入的最简高效写法
不要在循环里逐次调用execute发起SQL请求,使用pyodbc提供的executemany做批量提交,全程使用参数化查询规避注入风险:
# 构造参数化插入模板 columns = ','.join(my_dict.keys()) placeholders = ','.join(['?'] * len(my_dict)) insert_sql = f"INSERT INTO TABLEabc ({columns}) VALUES ({placeholders})" # 批量提交数据 cursor.executemany(insert_sql, [tuple(my_dict.values())]) cursor.commit()
如果是插入多组数据(比如多个同结构字典组成的列表),只需要把每个字典的值转成元组,统一放到参数列表里传入即可,执行效率比逐次循环调用execute高一个数量级。
2. 单条INSERT插入全量值的写法
直接提取字典所有列名、对应值,构造单条参数化SQL执行即可。如果字典里包含GETDATE()这类需要在SQL侧执行的函数,需要特殊处理不做参数绑定,普通值统一走参数传递:
cols = [] params = [] val_placeholders = [] for k, v in my_dict.items(): cols.append(k) # 识别SQL内置函数,直接拼接到SQL语句中 if isinstance(v, str) and v.endswith('()'): val_placeholders.append(v) else: val_placeholders.append('?') params.append(v) final_sql = f"INSERT INTO TABLEabc ({','.join(cols)}) VALUES ({','.join(val_placeholders)})" cursor.execute(final_sql, params) cursor.commit()
如果字典里没有需要SQL侧执行的函数,写法可以大幅简化:
columns = ','.join(my_dict.keys()) placeholders = ','.join('?' * len(my_dict)) sql = f"INSERT INTO TABLEabc ({columns}) VALUES ({placeholders})" cursor.execute(sql, tuple(my_dict.values())) cursor.commit()
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

