2017-08-02 91 views
0

我們正在調查我們是否應該從SQLalchemy轉到我們項目的peewee。我們希望禁用屬性的延遲加載,以便只有在顯式連接到執行的查詢中時才加載它們。例如:在peewee中禁用延遲加載

for topping in Topping.select().where(Topping.stock > 0): 
     print " - %s (%s): %s pieces left" % (topping.name, topping.category.name, topping.stock) 

打印:

  • 的Mozzarella(奶酪):50片左
  • 羅勒(草本):100張左
  • 辣(肉):60片左

在我的查詢中,我沒有明確加入ToppingCategory,但它似乎取回它的名字。有什麼辦法可以禁用它嗎?

回答

0

它是花費你一個查詢每行來查找類別。查看關於N + 1查詢問題的文檔:http://docs.peewee-orm.com/en/latest/peewee/querying.html#nplusone

當您訪問FK(類別)時,如果它不可用,peewee將加載它,這需要一個SELECT語句。

在你的榜樣,你會需要:

一)急切地加載 B類)不訪問類別

對於一個),你可以這樣寫:

query = Topping.select(Topping, ToppingCategory.name).where(Topping.stock > 0) 
for topping in query: 
    print topping.name, topping.category.name 
+0

清除@coleifer。我的問題是,如果開發人員嘗試訪問該類別時沒有獲取該類別,是否有提升錯誤的方法。也有沒有辦法獲得類別ID而無需加載整個對象?謝謝 – valanto

+0

是的,默認情況下會選擇分類ID。 YOu可以使用「topping.category_id」訪問它,而不會產生查詢。如果您對引發異常感到好奇,您可以在測試中看到「assertQueryCount」是如何實現的。基本上附加一個查詢日誌處理程序,並查看日誌消息的計數。 YOu也可以monkeypatch execute_sql()。 – coleifer