我有一本包含键和值的字典,例如:
my_dict = {'a':33, 'b': 'something', 'c': GETDATE(), 'd': 55}
Run Code Online (Sandbox Code Playgroud)
假设SQL表中的列名也像字典的键一样命名,即“a,b,c,d”。
实际的字典有 20 多个键:值对。
我已经使用pyodbc.connect创建了一个cursor可以用来执行 SQL INSERT 语句的文件:
for k in my_dict.keys():
cursor.execute(
'''
INSERT INTO TABLEabc (%s)
VALUES (%s)
'''
% (k, my_dict[k])
)
Run Code Online (Sandbox Code Playgroud)
但这看起来效率很低,因为每次都是一个新的 SQL 操作。
如果您使用 pyodbc 那么这可能有效:
columns = {row.column_name for row in cursor.columns(table='TABLEabc')}
safe_dict = {key: val for key, val in my_dict.items() if key in columns}
# generate a parameterised query for the keys in our dict
query = "INSERT INTO TABLEabc ({columns}) VALUES ({value_placeholders})".format(
columns=", ".join(safe_dict.keys()),
value_placeholders=", ".join(["?"] * len(safe_dict)),
)
cursor.execute(query, list(safe_dict.values()))
Run Code Online (Sandbox Code Playgroud)
它旨在防止 SQL 注入,因为:
它可能不起作用的地方:
引用/转义是特定于数据库的,因此我们必须检查实际数据库的规则并将其应用于我们格式化为查询的字典键。(或者找到某种方法让 pyodbc 为我们做到这一点,不确定是否可能)
如果您相信自己my_dict不包含恶意代码,那么您可以简化为:
query = "INSERT INTO TABLEabc ({columns}) VALUES ({value_placeholders})".format(
columns=", ".join(my_dict.keys()),
value_placeholders=", ".join(["?"] * len(my_dict)),
)
cursor.execute(query, list(my_dict.values()))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7254 次 |
| 最近记录: |