gpt4 book ai didi

python - 在查询中插入表名会给出 sqlite3.OperationalError : near "?": syntax error

转载 作者:IT老高 更新时间:2023-10-28 22:21:25 26 4
gpt4 key购买 nike

我想动态选择要在 SQL 查询中使用的表,但我一直收到错误,但我正在尝试对其进行格式化。还尝试了 %s 而不是 ?

有什么建议吗?

group_food = (group, food)
group_food_new = (group, food, 1)

with con:

cur = con.cursor()
tmp = cur.execute("SELECT COUNT(Name) FROM (?) WHERE Name=?", group_food)

if tmp == 0:
cur.execute("INSERT INTO ? VALUES(?, ?)", group_food_new)
else:
times_before = cur.execute("SELECT Times FROM ? WHERE Name=?", group_food)
group_food_update = (group, (times_before +1), food)

cur.execute("UPDATE ? SET Times=? WHERE Name=?", group_food_update)

最佳答案

您不能使用 SQL 参数作为 SQL 对象中的占位符;使用 SQL 参数的原因之一是转义值,以便数据库永远不会将内容误认为数据库对象。

您必须单独插入数据库对象;通过将任何 " 双引号参数加倍并使用

来转义您的标识符
cur.execute('SELECT COUNT(Name) FROM "{}" WHERE Name=?'.format(group.replace('"', '""')), (food,))

cur.execute('INSERT INTO "{}" VALUES(?, ?)'.format(group.replace('"', '""')), (food, 1))

cur.execute('UPDATE "{}" SET Times=? WHERE Name=?'.format(group.replace('"', '""')),
(times_before + 1, food))

".." 双引号用于正确标记标识符,即使该标识符也是有效的关键字;名称中任何现有的 " 字符都必须加倍;这也有助于消除 SQL 注入(inject)尝试。

但是,如果您的对象名称是用户来源的,则您必须对对象名称进行自己的(严格)验证,以防止此处的 SQL 注入(inject)攻击。在这种情况下,请始终根据现有对象验证它们。

你真的应该考虑使用像 SQLAlchemy 这样的项目改为生成您的 SQL;它可以负责验证对象名称并严格保护您免受 SQL 注入(inject)风险。可以load your table definitions up front所以它会知道什么名字是合法的:

from sqlalchemy import create_engine, func, select, MetaData

engine = create_engine('sqlite:////path/to/database')
meta = MetaData()
meta.reflect(bind=engine)
conn = engine.connect()

group_table = meta.tables[group] # can only find existing tables
count_statement = select([func.count(group_table.c.Name)], group_table.c.Name == food)
count, = conn.execute(count_statement).fetchone()
if count:
# etc.

关于python - 在查询中插入表名会给出 sqlite3.OperationalError : near "?": syntax error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387537/

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