Django+MongoDB

來源:互聯網
上載者:User
文章目錄
  • bala bala NoSQL & MongoDB
  • Django對NoSQL的支援
  • Django + MongoDB的抉擇
  • Django+MongoEngine
  • 其他
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的方式去思考問題。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.