標籤:mongodb mongoengine pymongo django nosql資料庫
一、前文
Django 是一種 Python Web 架構,由對象關係映射器 (ORM)、後端控制器和模板系統組成。MongoDB 是一種面向文檔的資料庫(也稱為 NoSQL 資料庫),能有效地進行擴充並提供高效能。在本文中,我們將學習如何從 Python 調用 MongoDB(使用 MongoEngine),以及如何將它整合到 Django 項目中以代替內建的 ORM。
NoSQL 資料庫是 “下一代資料庫,主要具有以下幾個要點:非關係型、分布式、開放源碼和可水平伸縮”。面向文檔的資料庫 MongoDB 就是這種類型的資料庫。要添加對 MongoDB 的支援非常容易,但要以失去自動管理面板為代價。因此,您必鬚根據您的需要進行權衡。
MongoDB 是一種無模式資料庫,與關係型資料庫完全相反。無模式資料庫沒有使用表格,而是使用由文檔組成的集合。這些文檔是使用對象字面量文法建立的。
可參考:
http://www.zhihu.com/question/20059632
http://www.csdn.net/article/2014-03-06/2818652-when-use-mongodb-rather-mysql
二、工程需求
Django 通過mongoengine庫調用mongoDB,由於mongoengine底層使用的是pymongo庫,所以安裝mongoengine的時候一定要安裝與其版本配套的pymongo版本。幾條命令,分別用於安裝pymongo,mongodb,關/開mongodb服務,若easy_install安裝不成功,就要安裝easy_install工具:
easy_install pymongoapt-get install mongodbservice mongodb stop/start
第一部分:
pymongo
<pre name="code" class="html">import pymongocon=pymongo.Connection('127.0.0.1',27017) #串連到資料庫db=con.cimcc #擷取資料庫db.authenticate('username','password')collection=db.cimcc_user #獲得表
舉例子應用:
1、尋找
collection.find({‘level‘:2,‘userid‘:int(float(item))})
返回list,下面2有樣本
2、降序排序,擷取鍵值
for i in collection.find().sort([("userid",-1)]):
userid=i[‘userid‘]+userid
3、插入資料項目
collection.insert({‘userid‘:1})
4、更新
collection.update({‘userid‘:int(float(item))},{‘$set‘:{‘status‘:1}},upsert=False,multi=True)
有興趣可以研究一下update的四個參數,第一個為匹配,第二個為條件(條件上可以大作文章),第三個為沒找到是否插入,第四個為是否支援多操作
pymongo夠直接,但脫離了python web設計的本意,django也是mvc設計的典型例子,然後利用pymongo就不能很好地體現這點,耦合度較高。
第二部分:
mongoengine
其實開始我是打算用django-nonrel,因為利用其可以再記憶體中類比ORM,繼承models.Model,管理者admin就有一個可視化管理資料庫的介面(內建),也可以利用Model的函數映射到mongodb,但想想就好,後來沒能成功裝上,估計被牆了。後來發現知乎有人說:
django的ORM並不支援NoSQL,但是有一個叫django-nonrel的分支,擴充了django的ORM,支援部分NoSQL資料庫,其中包括mongodb
從我最後一次關心django-nonrel時它的可用度來看,實際生產環境使用還是很困難。比如說:
- mongodb類NoSQL天然沒有join操作,所以在django-nonrel中使用mongodb時沒有多表繼承功能,只能從abstract類繼承
- 沒有join的操作也意味著很多atomic的SQL查詢需要轉換成非atomic的nosql查詢
- 很多原ORM的特性在django-nonrel中使用會拋出NotImplemented的異常。
所以正常情況下請勿使用django-nonrel提供的nosql支援(除非你有興趣給它貢獻代碼)
http://www.zhihu.com/question/19818326
於是我還是用了mongoengine,繼承Document而不是models.Model,效果也還行。
from mongoengine import *connect('database',host='127.0.0.1',username='username',password='password')# Create your models here.class cimc_message(Document):msg_from=StringField(required=True)to=IntField(required=True)msg_type=StringField(required=True)status=IntField(required=True)result=IntField(required=True)def insert(self):self.save()
1、get_or_create
cimc_message.objects.get_or_create(msg_from=‘admin‘,to=‘xiaoming‘,msg_type=‘type1‘,status=0,defaults=msg_dic)
找到匹配條件就返回該條資料,否則就插入defaults,defaults為字典
2、delete
cimc_message.objects(msg_from=‘admin‘,to=‘xiaoming‘,msg_type=‘type1‘,status=0).delete()
...其他的舉一反三,邊用邊找
mongodb在python中的應用——利用pymongo和mongoengine