我有一个网页,允许用户更新一些数据,但用户可以更新所有数据或仅更新部分数据,例如,一个用户可以进行以下更新:
{key1: "value", key2: "value", key3: "value"}
但是另一个用户可能只更新密钥1字段。
我的问题是,我如何构建SQL语句,以便更新从用户获得的信息
def update_info(data: dict, id: int):
query : """
UPDATE table
SET (the key/value pairs of the data)
WHERE id = %(id)s
"""
data["id"] = id
database_call(query,data)
我问这个问题是因为我知道我可能可以用f字符串来完成,但我担心任何类型的SQL注入,而且收到的数据已经用cerberus进行了验证。
因此,作为使用sql
模块的示例:
from psycopg2 import sql
data = {"id": 1, "key1": "value1", "key2": "value2", "key3": "value3"}
update_fields = list(data.keys())
update_sql = sql.SQL("""UPDATE
table
SET
({}) = ({})
WHERE id = %(id)s
""").format(sql.SQL(", ").join(map(sql.Identifier, update_fields)),
sql.SQL(", ").join(map(sql.Placeholder, update_fields)))
cur = con.cursor()
cur.execute(update_sql, data)
con.commit()
这显然没有在你的数据上进行测试,但它应该作为一个粗略的指南来帮助你做什么