【问题标题】:Why do I get the error 'sqlite3.OperationalError: near "?": syntax error'? [duplicate]为什么我会收到错误'sqlite3.OperationalError: near "?": syntax error'? [复制]
【发布时间】:2015-09-24 02:05:50
【问题描述】:

我无法进行非常简单的sqlite3 查询。以下代码

p = ('user',)
cursor.execute("SELECT Guid FROM ? LIMIT 1",p)

给出错误

Traceback (most recent call last):
  File "try_Units.py", line 21, in <module>
    cursor.execute("SELECT Guid FROM ? LIMIT 1",p)
sqlite3.OperationalError: near "?": syntax error

但我使用的是示例 here 中解释的确切语法。那么这个语法有什么问题(python 3.4.0)?

我想从名为“用户”的表中访问属性“Guid”。

【问题讨论】:

  • 如果你的模式已经很好地规范化并且你没有编写 ORM 或类似的东西,那么你永远不必有一个动态的 FROM 子句。

标签: python sqlite


【解决方案1】:

您不能将 SQL 参数用于对象名称(例如表或列)。毕竟,参数的全部意义在于防止值被解释为 SQL 对象或命令。

在此处使用字符串格式,但如果输入来自用户,请检查您的输入,以防止 SQL 注入:

p = 'user'
cursor.execute("SELECT Guid FROM {} LIMIT 1".format(p))

【讨论】:

  • 我读了那个答案,但我不明白答案。如果不能使用,引入带问号的语法有什么意义?
  • @Alex:您可以将它用于。表名不是值。
  • @Alex:使用?,您正在尝试生成查询SELECT Guid FROM 'user' LIMIT 1,但您无法从SQL 字符串中进行选择; 'user' 是一个字符串,而不是名为 user 的表。
  • @Alex:不,Guid 是列名。 SELECT Guid FROM user WHERE name='foobar' 将使用 'foobar' 作为值(您可以将其存储在 in 数据库列中)。所以SELECT Guid FROM user WHERE name=? 是对 SQL 参数的有效使用。
  • 一个值来自用户输入,通常在 where 子句中使用,例如“SELECT * FROM MY_TABLE WHERE some_column = ?”。
猜你喜欢
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2017-02-02
  • 2021-07-06
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多