【问题标题】:Python SQLite near "?": syntax error“?”附近的 Python SQLite:语法错误
【发布时间】:2013-08-12 03:11:43
【问题描述】:

另一个问题。我正在尝试:

self.table = 'table'
a = 'column'
b = 'value'

c.execute('INSERT INTO ? (?) VALUES (?)', (self.table, a, b))

但我得到了

<class 'sqlite3.OperationalError'>:near "?": syntax error

同时,

c.execute('INSERT INTO {0} ({1}) VALUES ({2})'.format(self.table, a, b))

工作完美无缺,除了安全问题。

我意识到我不是第一个遇到这个问题的人,但我还没有找到适合我的解决方案。

【问题讨论】:

标签: python sqlite


【解决方案1】:

表名、列名不能参数化。请尝试关注。

self.table = 'table'
b = 'value'

c.execute('INSERT INTO {} ({}) VALUES (?)'.format(self.table, a), (b,))

【讨论】:

  • 我一直这样做。您必须注意 self.table 是一个您可以绝对控制的值,因为如果您没有严格控制它,SQL 注入攻击是绝对可能的。 :)
  • 这也不完全奏效。显然,列名也不能参数化。 c.execute('INSERT INTO {0} ({1}) VALUES (?)'.format(self.table, a), (b,)) 有效。幸运的是,我也可以完全控制列名。
  • @crshd 不幸的是,几乎所有用于任何语言和任何 DB 的 DB 驱动程序都不支持表名或列名的参数化。只要您非常小心不以任何方式包含任何类型的用户输入的表名和列名,就可以安全地执行您正在执行的操作。小心点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2013-12-30
  • 2018-10-08
相关资源
最近更新 更多