為什麼很多人都喜歡 Django 的 ORM 而不是 SQLAlchemy,是因為簡單嗎?


Django 的 Model 驅動對資料庫層面上的實現細節關注的非常少,開發者定義模型的過程非常接近聲明式而非過程式,對於新項目來說,可能是這個原因讓 Django Model 比 SQLAlchemy 討人喜歡。

傳統的 SQLAlchemy 的使用方法是不入侵模型,在單獨的地方定義表結構、映射規則,然後用 SQLAlchemy 驅動注入到模型類里去,這種方法可以完全避免模型與資料庫的耦合,但是定義繁瑣,要求開發者完全明白 engine、metadata、table、column、mapper 等概念,如果沒有讀過《企業應用架構模式》一類書籍會被弄得很亂。

現在 SQLAlchemy 提供了 declarative 的方式,和 Django Model 很像,但是和聲明式模型還是有一定的距離,好在對於靈活性幾乎沒損失。但是我對比了一下 Django Model 和 SQLAlchemy declarative,發現 Django Model 還是更簡潔一些。例如對於類關聯,Django 只要直接聲明外鍵,就自動產生關聯對象,而 SQLAlcyhemy 要定義外鍵、relationship 對象,如果有多個外鍵還要自己指定 join 規則…… 總之靈活性是好東西,但是不是什麼情況下都討人喜歡的。

我本來想說這個是 ActiveRecord style 和 Data Mapper style 區別導致的,但是細想了一下,Django Model 並不是簡單的 ActiveRecord,其對於複雜關聯甚至繼承的映射都有很好的適應性,應該和 SQLAlchemy 的 declarative 是同類型的,是對 Data Mapper 的 Active Record style 包裝。


因為在Django世界中它的ORM就是事實標準。Django最重要的特色是什麼?從ORM快速生成後台管理界面!另外還有ModelForm、數據遷移(migration)等等從Django ORM延伸出去的概念……如果你選用了SQLAlchemy,那麼這一切都沒有了,你必須自行搭建,或者選用第三方庫。話說,沒有了內置ORM、沒有了內置後台管理界面、沒有了內置ModelForm、沒有了數據遷移的Django,還是Django嗎?不如直接用其它更輕量或更鬆散的框架好了!

另外,在Django之外單獨使用Django ORM是不靠譜的。如果是其它環境,使用SQLAlchemy就好了。


我從2006年開始,翻譯過SQLAlchemy、Django、SQLObject的文檔。你自己去看看英文文檔就知道了,SQLAlchemy那是給人看的么?一個ORM而已,搞了1000頁的文檔,而且字特別密集,廢話一蘿筐。我都懷疑寫文檔的人是不是在用英文的某種文言文在寫,簡單的話,卻幾乎各種同義生詞,奇怪語法。

英文文檔里一個對立面可以參考Flask的文檔,那叫一個簡單易懂。

2006-2007年,我依次完成了SQLObject和SQLAlchemy的文檔後(部分翻譯)。發現SQLObject在逐漸沒落(現在很多人都沒聽說過了)。而SQLAlchemy又是如此奇葩的存在。就只好搞定了DBUtils,然後就不再用任何ORM了。

以我的觀點,ORM是在SQL之上的封裝,而這種封裝引入了太厚的封裝,使得程序員對底層的控制力明顯減弱,又加入了太多新的設計。所以我是不贊同使用ORM的,還是乾乾淨淨的SQL好用的多。


sqlalchemy使用上有兩個層次,1是使用sql expression, 說白可以讓你用python寫sql, 2是它的orm, orm是使用session的,自行管理session生存期,自行在多個過程中傳遞session,自行管理事務。寫法上是通常的transaction script(java常說的貧血的domain model)模式。實際編碼通常1和2混合編程。

django通過中間件部分隱藏了連接/事務管理的概念,寫法上也比較簡單,接近java常說的充血的domain model. 內容上也沒有sqlalchemy 的sql expression層次。 易用性就體現出來了。

不過用過的orm中,能達到sqlalchemy這樣高度的orm, 還沒有在其他語言中看到。 ruby有sequal, java的jooq都有部分sqlalchemy思想的影子


Django的orm什麼時候獨立出來啊....


用ORM圖的就是簡單方便,Django的ORM正巧滿足了這個需求,複雜的直接用原生SQL就可以了


推薦閱讀:

TAG:Django框架 | SQLAlchemy | ORM |