Python那些事——Django vs SQLAlchemy 哪個更適合python呢?

編程語言 Django Python SQL 科趣 科趣 2017-10-18

什麼是 ORM?

在介紹 Python 的 ORM 框架(Django 和 SQLAlchemy)不同之前,我們先要確保完全理解 ORM 框架的用途。

ORM 代表對象關係映射(Object Relational Mapping)。讓我們依次看看這三個單詞,它們正好解釋了 ORM在真實環境中的用處:

Python那些事——Django vs SQLAlchemy 哪個更適合python呢?

對象 – 這部分表示使用框架的對象和編程語言,例如 Python。

關係 – 這部分表示正在使用的 RDBMS (關係數據庫管理系統)數據庫。其中包括許多流行的關係數據庫,而你可能正在使用以下數據庫 — MSSQL、MySQL、Oracle數據庫、PostgreSQL、MariaDB、PerconaDB、TokuDB。大多數關係數據庫之間的共同點是它們的關係結構(表、列,鍵、約束等)。

映射 – 最後這部分表示前兩部分對象和數據表之間的橋樑和連接。

因此可以得出的結論是 ORM 是為了將編程語言與數據庫之間相連,以便簡化創建依賴於數據的應用程序過程。

Django 和 SQLAlchemy 之間比較

Python那些事——Django vs SQLAlchemy 哪個更適合python呢?

Python那些事——Django vs SQLAlchemy 哪個更適合python呢?

Python那些事——Django vs SQLAlchemy 哪個更適合python呢?

活動記錄 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那些事——Django vs SQLAlchemy 哪個更適合python呢?

毫無疑問,在 Python ORM 框架中 SQLAlchemy 擁有最大的社區。如果社區對你至關重要(我認為它應該是),SQLAlchemy 該是你的選擇。這並不說明對於其它框架,你不能找到任何幫助,例如 Django。你也可以獲得 bug 修復,從 StackOverflow 得到問題的答案和其它需要的幫助,但概率僅僅比 SQLAlchemy 高。

性能

我認為只在這裡寫(X 比 Y 快)是不負責任的。由於 ORM 具有如此多特徵和功能,並且它們在每個框架中也不同,這將很難得出結論。根據我的經驗,使用框架特性的方式,會對應用程序中數據層的整體性能產生極大影響。因此我建議不要通過性能來選擇框架,而是應該學習如何合理利用框架。

假如在 ORM 框架中使用原始的 SQL 查詢、使用 Jooq 或者只是部分查詢不使用 ORM,可以瞭解 EverSQL 查詢優化器,這可能是最簡單優化任何查詢的方法。

總結

任何比較中,我認為最好把決策權交還給讀者。每個用例之間是不同的,不同的技術也可以更適用。看看上面指出的差異,讓我們知道你做出了什麼決定。

Python那些事——Django vs SQLAlchemy 哪個更適合python呢?

相關推薦

推薦中...