今天在豆瓣小组里看到了一个关于 django-nonrel 的帖子,通过回帖发现好多人对这个项目乃至整个 Django 社区的消息都非常滞后。比如有人还在以为 django-nonrel 能 merge 到 Django 的官方代码里……实在是看不下去了以后我就回帖了:
*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的支持应该会很快就出现。
写了这么多字不在博客上发一下是在是浪费 :)
既然开写了,我就试着再延伸一下。
技术方面, 想在 GAE 上跑完整 Django 的人目标多数是它提供的“免费”后台,以及社区里大量开源的可重用的应用。然而在 django-nonrel 项目之前 Django 后台是没法用的。其背后的原因是 Django 的 ORM (Object Relation Mapper) 不支持 GAE 的数据库 Google BigTable。
ORM,如果你试图去读它的代码,绝对是一项超级挑战。它的主要作用就是在不同的数据库之上建立一个统一的界面,所以你在使用 Django 写程序的时候不用去考虑数据后端的问题(大多数情况下不用,但剩下的少数情况才是真正出问题的时候)。 Django ORM 现在面临的问题是,它过去的抽象都是假设数据后端是一个支持 SQL 查询的数据库。而 Google BigTable,MongoDB,Cassandra 这些新兴的数据库根本和 SQL 是八杆子打不着的,所以 Django 对这些数据库提供原生支持不对 ORM 进行大手术是不行的。
然而这还不是最糟糕的,“糟糕”的是很多开发者在选择使用这些新型的所谓 "NoSQL" 数据库的时候并不想,或者不可能把整个数据都转移到新数据库里。他们多数需要在一定的时间里并行使用 NoSQL 数据库和传统的数据库。而 Django 过去不但不支持多种数据库并行使用,并且连相同数据库的多个事例并行都不支持。不过这个问题已经在 1.2 发行之后解决了,这里要再次感谢 @alex_gaynor在GSoC2009的努力 。
多数据库支持为 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 上暗示了这一点。
最后提供一下获取这些信息的相关连接: