Django的原生NoSQL支持

Stella981
• 阅读 669

今天在豆瓣小组里看到了一个关于 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 上暗示了这一点。

最后提供一下获取这些信息的相关连接:

django-nonrel项目首页

Alex Gaynor在DjangoCon.eu上有关NoSQL的演讲

GSoC2010年Django的query-refactor分支代码

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这