当前位置:  开发笔记 > 编程语言 > 正文

django和MongoDB

balabalaNoSQLMongoDB一个无任何特点的教师,他教导的学生不会有任何特点。今朝NoSQL还没有一个标准的定义,最常见的申明是non-relational,也有很多人申明为“NotOnlySQL”。NoSQL凡是意味着非关系型、分布式的数据存储,具备大数据量下的高机能,横
bala bala NoSQL & MongoDB
一个无任何特点的教师,他教导的学生不会有任何特点。今朝NoSQL还没有一个标准的定义,最常见的申明是"non-relational",也有很多人申明为“Not Only SQL”。NoSQL凡是意味着非关系型、分布式的数据存储,具备大数据量下的高机能,横向扩大才能,以及灵活的数据模型。也许,还意味着开源。
浪费时候就是自尽,尤其是浪费歇息的时候,直接威逼着生命。MongoDB是一种以文档情势存储的NoSQL。其首要的特点:
API: BSON
Protocol: lots of langs
Query Method: dynamic object-based language & MapReduce
Replication: Master Slave & Auto-Sharding
Written in: C++
Concurrency: Update in Place
Misc: Indexing, GridFS Links

Django对NoSQL的支撑
是的,Django将原生支撑NoSQL,然则不是如今。
你可能据说过django-nonrel 。即Django none relationship,非关系型的Django。django-nonrel供给了一层adapter,共同特定的backend,可以连接各类NoSQL。比如连接MongoDB的django-mongodb-engine。然则,django-nonrel 的实现是在内存中模仿SQL数据库操纵,这种思路没有获得Django核心的支撑,所以只能是一个外部版本。
query-refactor是GSoC(Google Summer of Code)的Django项目之一,已经进入Django的官方分支。query-refactor的作者Alex早已发布了query-refactor的“终极状况”。然则,因为该分支的完成时候与Django1.3的公布时候过于接近,所以没有赶上,在Django1.4的新特点清单docs.djangoproject.com—1.4中也没有找query-refactor的身影。若是有消息通晓人士不妨泄漏一下。
注:Alex并不是无名小卒,我们知道Django在1.2之前是不支撑多半据库的,恰是因为Alex的尽力,我们才干享用Django的多半据库特点。

Django + MongoDB的决定
最直接的体式格式是应用PyMongo——MongoDB供给的Python Driver。然则用惯了Django的Model层,其实不肯意本身去保护数据库连接,写一大堆CRUD的语句。
而django-nonrel,如前所述,未必是一个好的选择。同样的原因,django-mongodb-engine是基于django-nonrel的MongoDB backend实现,也不予推敲。
MongoEngine,在Django官方的支撑出来之前,我认为这是最好的选择。因为MongoEngine可以供给与Django Model(ORM)很是类似的体验,可以快速上手。看一下官网首页的例子:  mongoengine import *                           # To define a schema for a 
# document, we create a 
class Metadata(EmbeddedDocument):                   # class that inherits  
tags = ListField(StringField())                 # Document. 
revisions = ListField(IntField())               #
# Fields are specified by 
class WikiPage(Document):                           # adding field objects as 
title = StringField(required=True)              # class attributes to the 
text = StringField()                            # document class. 
metadata = EmbeddedDocumentField(Metadata)      # 
# Querying is achieved by 
>>> page.title = “Hello, World!”                    # calling the objects 
>>> for page in WikiPage.objects:                   # attribute on a document 
>>>     print page.title                            # class.

Django+MongoEngine 起首安装MongoEngine(依附pymongo)。之后在python shell中实验一下:
 mongoengine import *
connect(""employeeDB"")
class Employee(Document):
name = StringField(max_length=50)
age = IntField(required=False)
john = Employee(name="John Doe", age=25)
john.save()
jane = Employee(name="Jane Doe", age=27)
jane.save()
for e in Employee.objects.all():
print e["id"], e["name"], e["age"]
在Django中应用也很轻易,只需在models.py(若是你十分介怀,也可以零丁放在docs.py中)如许写:
 mongoengine import *
mysite.settings import DBNAME
connect(DBNAME)
class Employee(Document):
name = StringField(max_length=50)
age = IntField(required=False)
此中,DBNAME在settings.py中指定。
然后,在视图中就可以应用“文档模型“了。

其他
1.Mongo Engine的Field类型与Django ORM的Field类型有所不合,下面是一个简单的对比: 
MongoEngine Django
StringField CharField
URLField URLField
EmailField EmailField
IntField IntegerField
FloatField FloatField
DecimalField DecimalField
BooleanField BooleanField
DateTimeField DateTimeField
EmbeddedDocumentField --
DictField --
ListField --
SortedListField --
BinaryField --
ObjectIdField --
FileField FileField
2.尽管看起来像是ORM,但MongoDB绝对不是RDB。我想MongoEngine如许的设计是为了便利上手,然则应用的时辰,必然要遵守NoSQL的体式格式去思虑题目。
苏霍姆林斯基
推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有