【问题标题】:Can an arbitary column name be used in sqlite3 db?sqlite3 db中可以使用任意列名吗?
【发布时间】:2019-03-22 17:30:22
【问题描述】:

我正在尝试使用? 来允许我设置任意列名。

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("create table mytab (? text, ? real)", ('v1', 'v2'))

但我收到以下错误。所以建表时不能使用?

Traceback (most recent call last):
  File "/tmp/main1.py", line 10, in <module>
    c.execute("create table mytab (? text, ? real)", ('v1', 'v2'))
sqlite3.OperationalError: near "?": syntax error

【问题讨论】:

标签: python sqlite


【解决方案1】:

试试这样的?

"create table mytab ({} text, {} real)".format('v1', 'v2')

【讨论】:

  • 嗨!虽然这个答案可能会解决 OP 的问题,但不鼓励在 SO 上仅发布代码答案。提供一些解释将有助于 OP 更好地理解此解决方案,同时也有助于 SO 为该站点的未来用户提供优质解决方案的使命。谢谢!
  • 这是否允许任意列名?
  • 任意列名是什么意思?
  • 例如包含任意ASCII码(如ESC)的列名。
  • 我不知道,但我找到了这个页面,可能对你有用。查看 user35443 的回答:stackoverflow.com/questions/3373234/…
【解决方案2】:

SQL参数替换是解决SQL注入的方法。它试图将功能组件(例如关键字SELECT、语句分隔符;等)和数据组件(例如数字、字符串等与SQL完全无关的数据分开函数)

参数的重点是在传递给SQL引擎之前,如果需要,请求正确转义输入数据,因此数据保持数据,功能组件是功能组件。

所以你可以这样做:

SELECT x FROM table_y WHERE z = ?

并将'""; DROP TABLE table_y' 作为参数传递,这正是要匹配的字符串。但你不能这样做:

SELECT x FROM table_y WHERE ? = '""; DROP TABLE table_y'

并将'z' 作为参数传递并期望它的含义相同。因为当你传入'z' 时,它被解释为字符串,而不是列名。有了这个想法,你会看到你的例子上的SQL只会演变成SQL语法错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2020-11-26
    相关资源
    最近更新 更多