在SQL查询中使用字典键作为字段名称

时间:2015-12-25 07:21:52

标签: python mysql dictionary

我正在编写一个修改表的函数。它接收一个字典,键作为要修改的字段名称,相应的值作为新值。

for key, val in kwargs.keys():
    cursor.execute("UPDATE users SET %s = %s WHERE user_id = %s", [key, val, user_id])

这种方法似乎很好,但它在MySQL上出现语法错误,因为在查询中插入了引号first_name字段{}。 因此查询类似于UPDATE users SET 'first_name' = ...

我尝试了从查询中删除引号的所有方法,但似乎没有任何效果。

关于如何解决这个问题的任何想法,以及背后的原因?

2 个答案:

答案 0 :(得分:0)

执行两次字符串形式,您仍然可以享受DB驱动程序参数处理的好处:

for key, val in kwargs.keys():
    cursor.execute("UPDATE users SET %s = %%s WHERE user_id = %%s" % key, [val, user_id])

答案 1 :(得分:0)

使用Python字符串格式,然后传递将由您的DB库处理的用户给定值。 除非您的代码中定义了列名,否则不会出现SQL注入。如果从用户输入的值中获取列名,我们仍然倾向于SQL注入

我在示例代码中再做了一个假设,似乎您为给定的键/值对多次更新表,所以我构建了一个查询来执行相同的操作。

columns = kwargs.keys()
update_list = [ "%(key)s = %%(%(key)s)s" % {'key' : key} for key in columns]
kwargs.update(user_id = user_id)
cursor.execute("UPDATE users SET %(update_list)s WHERE user_id = %%(user_id)s" % { 'update_list' : ",\n".join(update_list)}, kwargs)