mongodb在python中的應用——利用pymongo和mongoengine,mongodbpymongo

來源:互聯網
上載者:User

mongodb在python中的應用——利用pymongo和mongoengine,mongodbpymongo

一、前文

          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時它的可用度來看,實際生產環境使用還是很困難。比如說:

  1. mongodb類NoSQL天然沒有join操作,所以在django-nonrel中使用mongodb時沒有多表繼承功能,只能從abstract類繼承
  2. 沒有join的操作也意味著很多atomic的SQL查詢需要轉換成非atomic的nosql查詢
  3. 很多原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()

...其他的舉一反三,邊用邊找




相關文章

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.