如果您使用的是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()))
它旨在避免SQL注入,因为:
- 我们只过滤数据库中实际列名的键
- 我们使用pyodbc cursor execute参数,因此值将被正确转义
可能不起作用的地方:
- 如果需要引用和转义任何列名,这不会自动发生,因此将失败
引用/转义是特定于db的,因此我们必须判断实际db的规则,并将其应用于格式化到查询中的dict键.(或者找到某种方法让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()))