作者:主播新鲜看连 | 来源:互联网 | 2014-05-28 16:53
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的体式格式去思虑题目。
苏霍姆林斯基