2010-03-13 60 views
2

我有一大組值V,其中一些可能存在於表T中。我想在表中插入那些尚未插入的值。到目前爲止,我的代碼是:使用SQLAlchemy批量選擇

for value in values: 
     s = self.conn.execute(mytable.__table__.select(mytable.value == value)).first()  
     if not s: 
      to_insert.append(value) 

我覺得這樣的運行速度比應該慢。我有幾個相關的問題:

  1. 有沒有一種方法來構建一個select語句,這樣你提供一個列表(在這種情況下,「價值」),其與SQLAlchemy的匹配列表,它記錄的響應?
  2. 這段代碼在構造select對象時過於昂貴嗎?有沒有辦法構造單個select語句,然後在執行時進行參數化?

回答

2

對於第一個問題,這樣的事情,如果我明白你的問題正確

mytable.__table__.select(mytable.value.in_(values) 

對於第二個問題,在時間1行查詢,這是過於昂貴的確,雖然你可能沒有在這件事上的選擇。據我所知,在SQLAlchemy中沒有元組選擇支持,所以如果有多個變量(認爲多元的鍵)比SQLAlchemy不能幫助你。

無論哪種方式,如果你選擇的所有匹配行,並插入你應該做的差:) 像這樣的東西應該工作:

results = self.conn.execute(mytable.__table__.select(mytable.value.in_(values)) 
available_values = set(row.value for row in results) 
to_insert = set(values) - available_values 
+0

嗯,我喜歡這個主意;一個問題是,我認爲價值太大,最大限度地減少了這種說法。我需要製作一張中間桌子嗎? – muckabout 2010-03-13 15:14:57

+0

如果數據來自數據庫,那麼您可以在數據庫中完全執行該操作。但是,如果沒有,您可以通過切片值列表輕鬆地對每1000個項目進行批量處理。:)不需要從本地已有的東西創建臨時表。 – Wolph 2010-03-13 15:20:38

+0

好點,那有效! – muckabout 2010-03-13 16:54:37