2010-04-27 82 views

回答

2

如果 - 正如Mike和Thomas在評論中提到的那樣 - 您需要這個數據庫查詢,您應該接受Thomas的建議並使用the DB-API

這裏有兩個例子:

MySQL的

import MySQLdb 
conn = MySQLdb.connect(host='localhost', user='u', passwd='p', db='mydb') 
curs = conn.cursor() 
uids = [1234,4321,1111] 
qry = ("""SELECT cheese 
      FROM cheeseshop 
      WHERE id IN (%s)""" % ','.join(['%s']*len(uids))) 
# 'SELECT cheese FROM cheeseshop WHERE id IN (%s,%s,%s)' 
curs.execute(qry, uids) 
curs.fetchone() 
# ... 

SQLite的

import sqlite3 
conn = sqlite3.connect(':memory:') 
curs = conn.cursor() 
uids = [1234,4321,1111] 
qry = ("""SELECT cheese 
      FROM cheeseshop 
      WHERE id IN (%s)""" % ','.join('?'*len(uids))) 
# 'SELECT cheese FROM cheeseshop WHERE id IN (?,?,?)' 
curs.execute(qry, uids) 
curs.fetchone() 
# ... 
9
' OR '.join("uid = '%s'" % u for u in uids) 

這調用了串' OR ',這需要在傳遞的列表,並把所述字符串中的每個元件之間的join功能,然後將其連接在一起。 (用來把OR值中的每個鍵=值對之間。)

()裏面的部分是理解,說:「在uids列表中的每個u,生成等於字符串"uid = '%s'"的值,但替代在u而不是%s標記「。

+0

我不認爲它比這更好。 +1。 – Escualo 2010-04-27 23:43:32

+4

請記住,如果這是SQL語句,更好的方法是使用DB-API引用:put「uid =?」 (用於'qmark' paramstyle),而不是每個uid,由OR分隔,然後將uid列表(以及其他參數)傳遞給'execute'方法。這樣你就不用擔心獲得報價權。 – 2010-04-27 23:48:27

+0

@Thomas:同意。當我發現參數化查詢的那一天,我跳上它們,從不回頭。 – Amber 2010-04-27 23:53:06

相關問題