2011-05-12 86 views
2

我正在研究一個需要龐大數據庫的項目。目前我們正在使用SQLAlchemy,但我關心性能問題。我的問題是,有如下查詢:SQL鍊金術表現

session.query(DataStorage).filter(DataStorage.storage_path.startswith(path)).all() 

SQLAlchemy如何做實際的翻譯和篩選。它是否通過SELECT子句從DataStorage獲得所有條目,然後檢查其中的每個條目?或者它知道如何將「過濾器(DataStorage.storage_path.startswith(path))」轉換爲SQL?在使用原生SQL查詢方面性能方面損失多少?

問候, 波格丹

回答

2

SqlAlchemy使用您的代碼來生成SQL語句。在你的情況下,你有類似的東西:

SELECT * FROM DataStorage WHERE DataStorage.storage_path LIKE 'path%'; 

一旦你使用.all(),查詢是針對數據庫運行的。所以在這種情況下,它會獲取結果集迭代器中的所有行並將它們返回給您。

1

我不熟悉的特定SQLAlchemy的構造你使用,但要找出最好的辦法是嘗試它。在MySQL中打開查詢日誌記錄並查看SQLAlchemy正在生成的查詢。您可以嘗試手動編寫查詢並比較兩者的性能。 (你需要在你的數據庫中有大量的測試數據。)

通常,ORM可以很好地處理簡單的SELECT,WHERE子句,ORDER BY等等。當你開始做很多連接或者處理很多數據,構建的查詢往往不太理想。這是特定於您的應用程序。我通常採用的方法是使用ORM編寫一些東西,並在必要時用SQL進行優化和替換。

+0

您還可以打開SQLAlchemy中的日誌記錄以查看生成的SQL。 – codeape 2011-05-12 12:27:37