gpt4 book ai didi

python - 如何(安全地)将字典转换为 Python 中 sqlite 的 UPDATE 语句?

转载 作者:行者123 更新时间:2023-12-04 15:03:42 29 4
gpt4 key购买 nike

例如,我有一张学生表,我有一本 Python 字典

mydict = {"fname" : "samwise", "lname" : "gamgee", "age" : 13}

我怎样才能安全地生成一个 Python 函数来将其更新到我的 student 表中? (在我的用例中,我可以安全地假设学生已经存在于表中,并且我已经知道 id)

我已经创建了一个实现这个功能的函数,但我不禁觉得它有点粗糙,而且可能会受到 SQL 注入(inject)攻击

def sqlite_update(conn, table, data, pkeyname, pkeyval):
set_lines = ""
for k,v in data.items():
set_lines += "{} = '{}', ".format(k,v)

set_lines = set_lines[:-2] #remove space and comma from last item

sql = "UPDATE {0} SET {1} WHERE {2} = '{3}'"
statement = sql.format(table, set_lines, pkeyname, pkeyval)

conn.execute(statement)
conn.commit()

要更新,我只需调用

sqlite_update(conn, "student", mydict, "id", 1)

最佳答案

我假设您正在使用 sqlalchemy。在这种情况下,您可以使用 sqlalchemy.sql.text 函数在需要时转义字符串。

您可以尝试如下调整您的功能。

from sqlalchemy.sql import text

def sqlite_update(conn, table, data, pkeyname, pkeyval):
set_lines = ",".join([f"{k}=:{k}" for k in data.keys()])
statement = text(f"UPDATE {table} SET {set_lines} WHERE {pkeyname} = :pkeyval")

args = dict(data)
args["pkeyval"] = pkeyval
conn.execute(statement, args)
conn.commit()

有关更多详细信息,请参阅 text 上的 sqlalchemy 官方文档功能。

编辑

至于 sqlite3 连接,你可以做与上面基本相同的事情,稍作改动。

def sqlite_update(conn, table, data, pkeyname, pkeyval):
set_lines = ",".join([f"{k}=:{k}" for k in data.keys()])
statement = f"UPDATE {table} SET {set_lines} WHERE {pkeyname} = :pkeyval"

args = dict(data)
args["pkeyval"] = pkeyval
conn.execute(statement, args)
conn.commit()

引用sqlite3 execute

关于python - 如何(安全地)将字典转换为 Python 中 sqlite 的 UPDATE 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66530529/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com