sqlite3 python参数传递问题

时间:2012-07-12 21:17:04

标签: python sql sqlite

我有这段代码:

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

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

2 个答案:

答案 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

SQLite INSERT

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

或者它可能完全不同。 :)