Django+MongoDB


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的抉擇

  1. 最直接的方式是使用PyMongo——MongoDB提供的Python Driver。但是用慣了Django的Model層,實在不願意自己去維護數據庫連接,寫一大堆CRUD的語句。
  2. 而django-nonrel,如前所述,未必是一個好的選擇。同樣的原因,django-mongodb-engine是基於django-nonrel的MongoDB backend實現,也不予考慮。
  3. MongoEngine,在Django官方的支持出來之前,我認為這是最好的選擇。因為MongoEngine可以提供與Django Model(ORM)非常類似的體驗,可以快速上手。看一下官網首頁的例子:
    from mongoengine import *                           # To define a schema for a 
    # document, we create a
    class Metadata(EmbeddedDocument): # class that inherits from
    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中實驗一下:

from 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中)這樣寫:

from mongoengine import *
from 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的方式去思考問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM