SQLAlchemy(簡稱 SA)作為 Python 生態系中最強大的 ORM 框架之一,其文檔品質堪稱典範。但功能豐富也意味著學習曲線陡峭。本文提煉幾個實戰中高頻使用的核心特性,幫助開發者快速掌握 SA 的精髓。
關聯查詢是關係資料庫的常態。Django ORM 早期不支援 JOIN,SQLObject 實作也不理想。SA 提供 joinedload、subqueryload 等策略,在查詢主物件時一次性載入關聯集合,避免迴圈中產生大量 SQL 查詢。
標準多對多透過中間表隱式處理。但當關聯本身帶有屬性(如 user-bookmark-tag 的標籤權重、產品-元件-供應商 的採購價)時,將中間表映射為實體類別(Association Object)更靈活,可直接操作關聯屬性。
文章內容(body)、二進位檔案欄位往往佔據大量空間。列表頁不需載入這些欄位。SA 的 deferred() 讓欄位在首次存取時才發送 SQL,Hibernate 實作同樣功能極其繁瑣,動態語言特性讓 SA 實作極為優雅。
將類別映射到任意 SELECT 陳述式(視圖、CTE、複雜子查詢)。這意味著 幾乎沒有 SA 無法映射的資料結構,極大擴展了 ORM 的適用場景。
Session 追蹤物件狀態、關聯、決定刷新順序。Identity Map 以主鍵為 key 的快取,保證同一主鍵在同一 Session 內只有一個實例,避免多實例修改衝突。但也可能導致「舊資料」問題(如 ticket 458)。always_refresh=True 可強制重查,但會丟失未提交的修改,需謹慎使用。
刪除 User 時,關聯的 Article 是否連帶刪除?relation(cascade="delete, delete-orphan") 等參數精細控制級聯行為,符合業務邏輯需求。
選擇 ORM 是為了脫離 SQL,但不懂 SQL 就無法駕馭 SQLAlchemy。唯有深入理解關係資料庫原理、SQL 執行機制,才能發揮 SA 的極致威力:免寫 SQL、屏蔽方言差異、以物件方式管理資料存取、提升碼重用率。