2011-06-20 30 views
2

什麼是使用SQLAlchemy在Django項目執行復雜查詢的最佳選擇嗎?我找到了寧靜,但它看起來不像一個有很多用戶的項目......任何建議?的SQLAlchemy在Django項目執行復雜查詢

原因:我有整個項目30-40 RawQueries和維護這些疑問是痛苦的......我想的SQLAlchemy可以提供在這種情況下更好的體驗。

UPDATE。

主要目標實現的是一次寫一些大的複雜的查詢,並在以後改進它,因爲我需要:

q = get_big_complex_sqlalachemy_query() 
mine = q.filter_by(table.c.created_by_id=1) 
closed = q.filter_by(table.c.is_closed=True) 

使用Django和SQLAlchemy的最大的問題是事務管理。如果您使用大型事務(每個請求一次事務),SQLAlchemy在您提交它們之前不會看到任何更改(快速調試:)。所以我爲SQLAlchemy編寫了使用Django連接的自定義連接池。這也不理想(現在測試中存在問題,因爲SQLAlchemy喜歡將事務中的每個選擇都包裝起來,而且我仍然不知道如何禁用它),但它看起來更好。

+0

而且Django ORM無法完成任務嗎? – miku

+0

@miku,例如:我怎樣才能對一個表進行多次連接?像LEFT JOIN標籤t1 ... LEFT JOIN標籤t2?我發現的唯一方法是編寫RawQuery,但正如我所說,它看起來像sqlalchemy可以爲此提供更好的方法......至少要通過SQLAlchemy生成SQL並將其傳遞給RawQuery。 –

+0

@Vladimir:使用.extra(tables = ['table1','table2'])怎麼樣? –

回答

1

雖然我不熟悉的安靜,我可以說在Django使用SQLAlchemy的方式是...使用SQLAlchemy ......在Django!

當我用在Django項目的SQLAlchemy在過去,我通常也被從外部數據源的數據讀取(東西不是由Django的ORM管理)。考慮到這一點,我傾向於使用SqlSoup extension,它不要求您明確聲明數據的結構。這可能對你也有好處,因爲我猜你不想在兩個不同的ORM中將所有模型寫兩次。其他

一個建議:如果你不需要SQLAlchemy的每一個觀點,不要打開你的設置模塊的連接。將你的sqlalchemy代碼(包括連接創建)放在它自己的模塊或包中 - 儘可能保持它的獨立性。只有在真正需要時才導入模塊並創建連接。

所有這一切都取決於你的目標是什麼,但。你的查詢主要是閱讀,還是你想寫?我真的不知道你在做什麼。

+0

問題已更新。 SqlSoup很酷,但實際上我可以通過tables = MetaData().reflect(bind = engine)實現相同的效果。我使用它和自定義映射到Django模型(所以執行查詢後,我得到我的Django模型實例)。我對這個解決方案並不滿意,但在很多情況下,它絕對是從原始查詢中前進的。 –

+0

是的,絕對。你從使用反射中得到同樣的結果。如果你願意的話,SqlSoup只是一個捷徑。聽起來你比我想冒險的更進一步。說實話,在過去,我通過手工編寫sql來完成這種事情,並在滿足條件時追加相關部分。如果真正的問題是如何處理交易處理(在更新後的問題中陳述),那麼這是一個不同的故事。 –