您好,登錄后才能下訂單哦!
這篇文章主要介紹“Flask中如何優化SQL”,在日常操作中,相信很多人在Flask中如何優化SQL問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Flask中如何優化SQL”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在django中,我們可以使用 select_related和prefetch_related方法來做sql優化(以最少的sql查出所有需要的數據)如:select_related將會根據外鍵關系,在執行查詢語句的時候通過創建一條包含SQL inner join操作的SELECT語句來一次性獲得主對象及相關對象的信息,在Flask中,通過閱讀文檔,發現在SQLAlchemy的官網中有說到三種方法來做,類似django中的select_related和prefetch_related
急切加載:注意此方法應該適當使用,不同于django中的方法,會額外拆分出一條IN查詢
回想一下,我們之前演示了延遲加載操作,當我們訪問 a 的User.addresses集合User并發出 SQL 時。如果你想減少查詢的數量(在很多情況下是顯著的),我們可以對查詢操作應用一個急切的負載。SQLAlchemy 提供三種類型的預加載,其中兩種是自動的,第三種涉及自定義標準。這三個通常通過稱為查詢選項的函數調用,這些函數Query通過該方法為我們希望如何加載各種屬性提供額外的說明Query.options()。
選擇加載
在這種情況下,我們想指出User.addresses應該立即加載。加載一組對象及其相關集合的一個不錯的選擇是selectinload()選項,它發出第二個 SELECT 語句,完全加載與剛剛加載的結果關聯的集合。名稱“selectin”源于 SELECT 語句使用 IN 子句來一次定位多個對象的相關行的事實:
>>> from sqlalchemy.orm import selectinload >>> jack = session.query(User).\ ... options(selectinload(User.addresses)).\ ... filter_by(name='jack').one() SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.nickname AS users_nickname FROM users WHERE users.name = ? [...] ('jack',) SELECT addresses.user_id AS addresses_user_id, addresses.id AS addresses_id, addresses.email_address AS addresses_email_address FROM addresses WHERE addresses.user_id IN (?) ORDER BY addresses.id [...] (5,) >>> jack <User(name='jack', fullname='Jack Bean', nickname='gjffdd')> >>> jack.addresses [<Address(email_address='jack@google.com')>, <Address(email_address='j25@yahoo.com')>]
到此,關于“Flask中如何優化SQL”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。