2010-09-29 39 views
0

我有INTS的名單,我想加入到一個字符串加入字符串列表蟒蛇用繩子%的替換

ids = [1,2,3,4,5] 

,看起來像「ID = 1或ID = 2或ID = 3或ID = 4或ID = 5'

我現在有一個答案,但我認爲這可能是好的,以獲得專家組的意見

編輯:更多的信息,反對票塞耶斯... 這不直接生成SQL,這是動態表達式t帽子被髮送到使用下面的實體框架的Ado.net數據服務層。目前,服務器中的動態表達式處理程序/ EF4適配器不支持IN子句,因此暫時不得不求助於多個equals語句。

+0

就在你試圖做我認爲你正在做的事情的時候,你可以在Python中說'id in id'。如果'id'出現在列表'ids'中,它會返回true。 – JoshD 2010-09-29 02:44:43

+0

-1:關於這個的唯一用途是生成動態SQL。這是一件非常非常糟糕的事情。我的機器上的 – 2010-09-29 02:47:42

回答

4
" or ".join("id = %d" % id for id in ids) 
+0

,用新樣式替換舊樣式格式將其從14usec刪除到9.3usec。當然,它仍然不如通過避免字符串格式化得到的7.34 usecs;) – aaronasterling 2010-09-29 02:45:22

+0

@arron - 請你能否詳細說明 – 2010-09-29 03:27:02

+0

他正在談論'「id =%d」%id'與'「id = {}」 .format(id)'(舊與新)。 – snapshoe 2010-09-29 03:44:29

1
mystring = 'id =' + 'or id ='.join(str(i) for i in ids) 

如果你想生成動態sql那些在評論中所指出的那樣(不知道我怎麼錯過了它),你應該這樣做,因爲

mystring = ' or '.join(['id = ?']*len(ids)) 

哪裏?旨在替換爲數據庫庫的相應轉義序列。對於sqlite3,這是?。對於MySQLdb,它使用printf代碼IIRC。然後,您可以將id列表作爲第二個參數(通常是)在sql字符串之後傳遞給遊標,並以安全的方式將它們放在那裏。這總是正確的。

+0

謝謝你,它在標準意義上不是動態的,而是一個發送到ADO.NET數據服務(下面的EF4 ORM)服務的謂詞表達式。 – 2010-09-29 03:32:55