【发布时间】:2017-01-04 21:46:04
【问题描述】:
我有一个程序,用户可以在其中选择他们想要在 SQLite 中修改的表。我将选择存储在一个名为 table 的变量中,然后尝试从该表中选择所有内容
c.execute('SELECT * FROM ?', (table,))
程序卡在问号处。它说:
“Sqlite3.OperationalError:靠近“?”:语法错误”
我做错了什么?
【问题讨论】:
标签: python sqlite python-3.x
我有一个程序,用户可以在其中选择他们想要在 SQLite 中修改的表。我将选择存储在一个名为 table 的变量中,然后尝试从该表中选择所有内容
c.execute('SELECT * FROM ?', (table,))
程序卡在问号处。它说:
“Sqlite3.OperationalError:靠近“?”:语法错误”
我做错了什么?
【问题讨论】:
标签: python sqlite python-3.x
您不能使用参数替换表名。您需要自己将表名添加到查询字符串中。像这样的:
query = 'SELECT * FROM {}'.format(table)
c.execute(query)
需要注意的一点是表名的值的来源。如果那来自不受信任的来源,例如一个用户,那么您需要验证表名以避免潜在的 SQL 注入攻击。一种方法可能是构造一个参数化查询,从数据库目录中查找表名:
import sqlite3
def exists_table(db, name):
query = "SELECT 1 FROM sqlite_master WHERE type='table' and name = ?"
return db.execute(query, (name,)).fetchone() is not None
【讨论】: