我正在尝试使用?
来设置任意列名称。
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
答案 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语法错误。