什麼是 ORM?
在介紹 Python 的 ORM 框架(Django 和 SQLAlchemy)不同之前,我們先要確保完全理解 ORM 框架的用途。
ORM 代表物件關係對映(Object Relational Mapping)。讓我們依次看看這三個單詞,它們正好解釋了 ORM在真實環境中的用處:
● 物件 – 這部分表示使用框架的物件和程式語言,例如 Python。
● 關係 – 這部分表示正在使用的 RDBMS (關聯式資料庫管理系統)資料庫。其中包括許多流行的關聯式資料庫,而你可能正在使用以下資料庫 — MSSQL、MySQL、Oracle資料庫、PostgreSQL、MariaDB、PerconaDB、TokuDB。大多數關聯式資料庫之間的共同點是它們的關係結構(表、列,鍵、約束等)。
● 對映 – 最後這部分表示前兩部分物件和資料表之間的橋樑和連線。
因此可以得出的結論是 ORM 是為了將程式語言與資料庫之間相連,以便簡化建立依賴於資料的應用程式過程。
Django 和 SQLAlchemy 之間比較
活動記錄 vs 資料對映
Django ORM 採用活動記錄實現 — 大多數 ORM 中能看到這種實現。基本上也可以說是資料庫中每一行都直接對映到程式碼中的物件,反之亦然。ORM 框架(如 Django) 不需要為了在程式碼中使用屬性而預先定義架構,只需要使用它們,因為框架可以通過檢視資料庫架構“理解”結構。此外,也可以只儲存記錄到資料庫,因為它也對映到表中的特定行。
SQLAlchemy 採用資料對映實現 — 當使用這種方式實現時,資料庫結構和物件結構之間存在間隙(它們不像活動記錄的實現是 1:1)。大多數情況下,必須使用另外的持久層來保持與資料庫的互動(例如儲存物件)。因此當採用活動記錄實現的時候不能只呼叫 save() 方法(反對觀點),但另一方面,程式碼不需要知道資料庫中整個關係結構的執行,因為程式碼和資料庫之間沒有直接關係。
那麼它們之間誰獲勝了呢?都沒有。這取決於你要實現什麼。我相信如果你的應用程式大多是 CRUD (建立、讀取、更新、刪除)程式,而在不同資料實體之間沒有使用困難且複雜規則,那麼應該採用活動記錄實現(Django)。它將幫助你輕鬆快速地為產品設定 MVP,而不會有任何困難。如果有許多“業務規則”和限制條件,最好採用資料對映模型,因為它不會捆綁並強迫嚴格遵照活動記錄來考量。
使用複雜查詢
在某些情況下,Django 和 SQLAlchemy 可以同時使用。現實環境中我多次見到主用例是 Django 用於所有常規 CRUD 操作,而 SQLAlchemy 用於更復雜的查詢,通常是隻讀查詢。
有關這方面更多的資訊和例項,可以看看 BetterWorks 工程部落格(我們沒有任何聯絡,但不管怎樣,我們喜歡他們的部落格)。
主鍵自動生成
兩個框架之間的另一個不同是 Django 能為表自動建立主鍵, SQLAlchemy 卻做不到。必須手動為每張表建立主鍵。權衡利弊 — 你認為哪種框架最清楚符合表的主鍵?根據團隊的知識和經驗,可以自行決定。
自動提交
預設情況下,Django 會自動提交, SQLAlchemy 卻不行。自動提交會影響使用框架的方式(事務、回滾等)。
支援的資料庫
Django 和 SQLAlchemy 都能用於 MySQL、PostgreSQL、Oracle 和 SQLite。如果你正在使用 MSSQL,則應該使用 SQLAlchemy,因為它完全支援 MSSQL ,並且也可以找到更多相關的資訊和文件。
學習曲線
在網上有一個普遍的觀點,認為 Django 更容易學習。這是顯而易見的,由於它通常都用在沒有特別複雜的用例上。因此,應該考慮願意投入多少精力來學習框架,與 SQLAlchemy 交叉學習以便獲得更多的靈活性(假使你真的需要它)。
社群規模
毫無疑問,在 Python ORM 框架中 SQLAlchemy 擁有最大的社群。如果社群對你至關重要(我認為它應該是),SQLAlchemy 該是你的選擇。這並不說明對於其它框架,你不能找到任何幫助,例如 Django。你也可以獲得 bug 修復,從 StackOverflow 得到問題的答案和其它需要的幫助,但概率僅僅比 SQLAlchemy 高。
效能
我認為只在這裡寫(X 比 Y 快)是不負責任的。由於 ORM 具有如此多特徵和功能,並且它們在每個框架中也不同,這將很難得出結論。根據我的經驗,使用框架特性的方式,會對應用程式中資料層的整體效能產生極大影響。因此我建議不要通過效能來選擇框架,而是應該學習如何合理利用框架。
假如在 ORM 框架中使用原始的 SQL 查詢、使用 Jooq 或者只是部分查詢不使用 ORM,可以瞭解 EverSQL 查詢優化器,這可能是最簡單優化任何查詢的方法。
總結
任何比較中,我認為最好把決策權交還給讀者。每個用例之間是不同的,不同的技術也可以更適用。看看上面指出的差異,讓我們知道你做出了什麼決定。