Python将字典插入数据库表的最简单方法?

Mit*_*tch 5 python sql pyodbc

我有一本包含键和值的字典,例如:

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 操作。

  1. 使用循环插入值的最简单方法是什么?
  2. 我该如何编写它,以便它只插入一个包含所有值的内容?

Ane*_*pic 3

如果您使用 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 游标执行参数,因此值将被正确转义

它可能不起作用的地方:

  • 如果任何列名需要引用和转义,这不会自动发生,因此会失败

引用/转义是特定于数据库的,因此我们必须检查实际数据库的规则并将其应用于我们格式化为查询的字典键。(或者找到某种方法让 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)