可以在sqlite3 db中使用任意列名称吗?

时间:2019-03-22 17:30:22

标签: python sqlite

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

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

2 个答案:

答案 0 :(得分:0)

尝试类似的方法吗?

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

答案 1 :(得分:0)

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语法错误。