我正在编写一个修改表的函数。它接收一个字典,键作为要修改的字段名称,相应的值作为新值。
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' = ...
我尝试了从查询中删除引号的所有方法,但似乎没有任何效果。
关于如何解决这个问题的任何想法,以及背后的原因?
答案 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)