2011-03-10 77 views
0

我有一個三列表,cell,trxtype。 這是我試圖運行查詢:python sqlite參數擴展問題

db.execute("SELECT cell,trx FROM tchdrop").fetchall() 

它給正確的輸出。

然而,當我嘗試a = ("cell", "trx")然後

db.execute("SELECT ?,? FROM tchdrop", t).fetchall() 

輸出爲[(u'cell', u'trx'), (u'cell', u'trx')](這是錯誤的)

我這樣做是爲了弄清楚如何動態提取列是的一部分更大的問題。 (?)

回答

3

佔位蟒蛇DB-API的(如sqlite3的)不支持列名傳遞,所以你必須使用Python字符串格式化是這樣的:

a = ("cell", "trx") 

query = "SELECT {0},{1} FROM tchdrop".format(*a) 
db.execute(query) 

編輯:

,如果你不知道你要傳遞的列的長度,你可以做這樣的事情:

a = ("cell", "trx", "foo", "bar") 
a = ", ".join(a) 

query = "SELECT {0} FROM tchdrop".format(a) 
# OUTPUT : 'SELECT cell, trx, foo, bar FROM tchdrop' 
db.execute(query) 
+0

那麼,我該怎麼辦,如果我不知道的長度? – jck 2011-03-10 10:56:21

+1

@jck:看我的編輯,希望這可以幫助。 – mouad 2011-03-10 11:01:08

0

圖書館與他們的報價替換指定值("cell", "trx") d SQL等價物,所以你得到的是SELECT "cell", "trx" FROM tchdrop。結果是正確的。

你試圖實現的是?語法不可能實現的。相反,你自己做字符串替換。您可以使用正則表達式(如^[a-zA-Z_]$)檢查列名以獲得更高的安全性。

例如:

columns = ",".join(("cell", "trx")) 
db.execute("SELECT %s FROM tchdrop" % columns).fetchall()