1

我有这个代码:

conn = sqlite3.connect("testDB")
curs = conn.cursor()

curs.execute("CREATE TABLE IF NOT EXISTS testTable( col1 VARCHAR, col2 VARCHAR)")
c1 = "value1"
c2 = "value2"
curs.execute("INSERT INTO testTable VALUES (?,?)", (c1, c2))#this works fine
conn.commit()

def inDB(curs, table, col, value):
    curs.execute("SELECT * FROM ? WHERE ?=?",(table, col, value)) #problemis here
    return bool(curs.fetchone())

print inDB(curs, "testTable", "col1", c1)

它给了我这个错误:

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print inDB(curs, "testTable", "col1", c1)
  File "test.py", line 13, in inDB
    curs.execute("SELECT * FROM ? WHERE ?=?",(table, col, value))
sqlite3.OperationalError: near "?": syntax error

为什么这不起作用,我该如何解决?

4

2 回答 2

2

我不确定,但我认为您不能在表名或列名上使用绑定变量...

尝试

curs.execute("INSERT INTO ? VALUES (?,?)", (testTable, c1, c2))

我敢打赌这行不通。在这种情况下,您需要避免使用?表名或列名。我宁愿使用连接运算符来连接字符串,就像在 Java 中它是“+”一样。例如(Java 风格):

("INSERT INTO " + testTable + " VALUES (?,?)");
于 2012-07-12T21:25:38.980 回答
0

这是我可以从文档中提取的全部内容:

http://www.sqlite.org/cintro.html

3.0 绑定参数和复用预处理语句

在 SQLite 中,只要包含字符串字面量是有效的,就可以使用以下形式之一的参数:

http://www.sqlite.org/c3ref/bind_blob.html

在 sqlite3_prepare_v2() 及其变体的 SQL 语句文本输入中,文字可以替换为与以下模板之一匹配的参数:

http://www.sqlite.org/lang_insert.html

SQLite 插入

您可能不能使用参数化的表名,因为[database-name.]table-name它不是普通的文字值(这就是为什么您不能编写类似 的语句INSERT INTO 'foo'||'bar'||12 VALUES ...)。

或者也许是完全不同的东西。:)

于 2012-07-12T21:59:48.070 回答