键和值的参数化UPDATE失败

时间:2017-08-18 04:57:18

标签: python postgresql psycopg2

当我执行一个使用列名和值参数化的UPDDATE查询语句时,它会失败:

db.execute("UPDATE users SET %s = %s WHERE user_id = %s;", (key, user[key], user_id))

错误消息是

ProgrammingError: syntax error at or near "'firstname'"
UPDATE users SET 'firstname' = 'John' WHERE 'use...

我有一个数据库表“users”,其主要id字段为“user_id”,两个字段为“firstname”和“lastname”(每个字段的类型为varchar)。我还有一个字典“user”,其中包含键“user_id”,“firstname”和“lastname”(所有字符串)。现在要在我的脚本中的某个位置更新我的数据库,我想循环遍历字典来更新数据库:

for key in user.keys():
    if key != "user_id":
        db.execute("UPDATE users SET %s = %s WHERE user_id = %s;", (key, user[key], user_id))

然而,这会导致上面引用的错误消息。

我找到的脏解决方案是直接在我的查询字符串中插入密钥:

db.execute("UPDATE users SET " + key + " = %s WHERE user_id = %s;", (user[key], user_id))

...但我到处都读到这是不好的做法,因为SQL注入的漏洞(额外的问题:如果我实际上从我的“用户”字典中获取了来自表格或我脚本的硬编码部分的密钥,那么可能会出问题?) 那么这个问题的正确,非hacky解决方案是什么?

修改 我已经尝试过但没有成功的变体是:

db.execute("UPDATE users SET %s = %s WHERE 'user_id' = %s;", (str(key), str(user[key]), user_id))
db.execute("UPDATE users SET %s = %s WHERE 'user_id' = %s;", (key, str(user[key]), user_id))
db.execute("UPDATE users SET %s = %s WHERE user_id = %s;", (key, str(user[key]), user_id))
db.execute("""UPDATE users SET %s = %s WHERE user_id = %s;""", (key, user[key], user_id))
db.execute(r"UPDATE users SET %s = %s WHERE user_id = %s;", (key, user[key], user_id))

0 个答案:

没有答案