我有这段代码:
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
为什么这不起作用,我该如何解决这个问题?
答案 0 :(得分:2)
我不确定,但我认为你不能在表名或列名上使用绑定变量......
尝试
curs.execute("INSERT INTO ? VALUES (?,?)", (testTable, c1, c2))
我打赌它不起作用。在这种情况下,您需要避免在表名或列名上使用?
。我宁愿使用连接运算符来加入字符串,就像Java中的“+”一样。例如(Java风格):
("INSERT INTO " + testTable + " VALUES (?,?)");
答案 1 :(得分:0)
这是我可以从文档中提取的所有内容:
http://www.sqlite.org/cintro.html
3.0绑定参数和重用准备语句
在SQLite中,只要包含字符串文字,就有效 可以使用以下形式之一的参数:
http://www.sqlite.org/c3ref/bind_blob.html
在SQL语句文本中输入sqlite3_prepare_v2()及其 变体,文字可以替换为匹配其中一个的参数 以下模板:
http://www.sqlite.org/lang_insert.html
您可能无法使用参数化表名,因为[database-name.]table-name
不是普通的文字值(这就是为什么您不能编写像INSERT INTO 'foo'||'bar'||12 VALUES ...
这样的语句的原因。)
或者它可能完全不同。 :)