Django的原生NoSQL支持

今天在豆瓣小組裏看到了一個關於 django-nonrel 的帖子,經過回帖發現好多人對這個項目乃至整個 Django 社區的消息都很是滯後。好比有人還在覺得 django-nonrel 能 merge 到 Django 的官方代碼裏……實在是看不下去了之後我就回帖了:sql

*django-nonrel 的實現是採用在內存裏模擬SQL數據庫操做的方式,尤爲是它的做者想在內存裏模擬SQL裏的Join操做。這個沒有獲得Django核心的支持,因此它永遠只能是一個外部維護的補丁。 *數據庫

相比之下今年的GSoC的Django項目之一,在Django代碼樹裏的query-refactor分支,將爲Django帶來真正的NoSQL支持。它的做者是去年夏天經過GSoC爲Django帶來多數據庫支持的Alex Gaynor。Alex在這個分支裏已經提供了一個示範用的mongo db的bankends。django-nonrel的做者也在關注這個官方的行動,另外GAE的開發着也參加了DjangoCon.eu的有關NoSQL的現場問答。因此等這個分支merge之後Google BigTable的支持應該會很快就出現。django

寫了這麼多字不在博客上發一下是在是浪費 :)後端

既然開寫了,我就試着再延伸一下。app

技術方面, 想在 GAE 上跑完整 Django 的人目標多數是它提供的「免費」後臺,以及社區裏大量開源的可重用的應用。然而在 django-nonrel 項目以前 Django 後臺是無法用的。其背後的緣由是 Django 的 ORM (Object Relation Mapper) 不支持 GAE 的數據庫 Google BigTable。spa

ORM,若是你試圖去讀它的代碼,絕對是一項超級挑戰。它的主要做用就是在不一樣的數據庫之上創建一個統一的界面,因此你在使用 Django 寫程序的時候不用去考慮數據後端的問題(大多數狀況下不用,但剩下的少數狀況纔是真正出問題的時候)。 Django ORM 如今面臨的問題是,它過去的抽象都是假設數據後端是一個支持 SQL 查詢的數據庫。而 Google BigTable,MongoDB,Cassandra 這些新興的數據庫根本和 SQL 是八杆子打不着的,因此 Django 對這些數據庫提供原生支持不對 ORM 進行大手術是不行的。code

然而這還不是最糟糕的,「糟糕」的是不少開發者在選擇使用這些新型的所謂 "NoSQL" 數據庫的時候並不想,或者不可能把整個數據都轉移到新數據庫裏。他們多數須要在必定的時間裏並行使用 NoSQL 數據庫和傳統的數據庫。而 Django 過去不但不支持多種數據庫並行使用,而且連相同數據庫的多個事例並行都不支持。不過這個問題已經在 1.2 發行以後解決了,這裏要再次感謝 @alex_gaynor在GSoC2009的努力 。ip

多數據庫支持爲 NoSQL 的原生支持打下了一個堅實的基礎,今年夏天 Alex 的工做(GSoC是實實在在的工做!)就是進一步的改善 ORM 的抽象機制,把原來其中 query 層次有關 SQL 的假設轉移到 SQLCompiler 層次。(順便說一句, Django ORM 最恐怖的地方就是 django.db.models.sql.query ,喜歡挑戰的讀者不妨去看一下這兒的代碼。)有了這個抽象上的改進,寫一個 NoSQL 的 backend 就簡單了不少。內存

alex 的工做在 Django 倉庫的 query-refactor 分支進行,他正在 django.contrib 裏寫一個 MongDB 的原型。然而這個分支因爲 Django 1.3 的發行時間表太近因此不得不等到 1.4 的時候才能 merge。開發

因此……Django 1.4 將原生支持 Google App Engine 的 BigTable!

這可不是我猜的,Django 核心開發者 @freakboy3742,也就是 Russell Keith-Magee 在 DjangoCon.eu 上暗示了這一點。

最後提供一下獲取這些信息的相關鏈接:

django-nonrel項目首頁

Alex Gaynor在DjangoCon.eu上有關NoSQL的演講

GSoC2010年Django的query-refactor分支代碼

相關文章
相關標籤/搜索