2011-05-20 80 views
5

我想查詢我的sqlite3數據庫並使用列表中的值。這裏是我的代碼:Python SQL Select從列表變量中選擇語句?

for i in range(len(infolist)): 
    result = cursor.execute('SELECT COUNT(DISTINCT col1) 
           FROM tablename 
           WHERE col2 = ?', (infolist[i])) 

我收到此錯誤:

ProgrammingError: 'Incorrect number of bindings supplied. The current statement uses 1, and there are 22 supplied.'

,該字符串具有22個字符這就解釋了爲什麼有22個綁定。很明顯,我沒有正確地將字符串傳遞到SQL語句中。

+1

使用'IN'條款,如果陣列可以變成一個逗號分隔的列表,將工作更好地與緩解了循環的需要。 – 2011-05-20 01:54:44

回答

1

cursor.execute的第二個參數是一個序列,並且您已將它傳遞給一個字符串(這是一個字符序列)。如果你正試圖做一個元素元組,你需要一個逗號。即('item',)代替('item')

你也應該遍歷的項目,而不是使用範圍和我:

for info in infolist: 
    result = cursor.execute('SELECT COUNT(DISTINCT col1) 
           FROM tablename 
           WHERE col2 = ?', (info,)) 
+0

感謝您的信息,什麼是對,即遍歷多個列表您的想法。對於我在範圍內(len(infolist)): \t \t cursor.execute('UPDATE tabledata SET col1 = ?, col2 =?WHERE col3 =?',(infolist [i],infolist2 [i],infolist3 [i] )) – user735304 2011-05-20 10:41:59

+0

這又是一個問題,但'cursor.executemany( '更新資料表SET COL1 = ?, COL2 =?WHERE COL3 =?',拉鍊(inforlist,infolist2,infolist3))'是你想要的。 – lambacck 2011-05-20 13:38:42

0

您需要添加一個逗號來表示元組有1個元素:

>>> ('abc') 
'abc' 
>>> ('abc',) 
('abc',) 

嘗試通過(infolist[i],)cursor.execute

1

你需要一個逗號添加的(infolist[i])結束,現在它是一個22字符串不是一個元組。 (infolist[i],)應該修復該問題