设为首页 收藏本站
查看: 1697|回复: 0

[经验分享] mongodb在python中的应用——利用pymongo和mongoengine

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-12-11 13:56:41 | 显示全部楼层 |阅读模式
一、前文

          Django 是一种 Python Web 框架,由对象关系映射器 (ORM)、后端控制器和模板系统组成。MongoDB 是一种面向文档的数据库(也称为 NoSQL 数据库),能有效地进行扩展并提供高性能。在本文中,我们将学习如何从 Python 调用 MongoDB(使用 MongoEngine),以及如何将它集成到 Django 项目中以代替内置的 ORM。

        NoSQL 数据库是 “下一代数据库,主要具有以下几个要点:非关系型、分布式、开放源码和可水平伸缩”。面向文档的数据库 MongoDB 就是这种类型的数据库。要添加对 MongoDB 的支持非常容易,但要以失去自动管理面板为代价。因此,您必须根据您的需要进行权衡。

        MongoDB 是一种无模式数据库,与关系型数据库完全相反。无模式数据库没有使用表格,而是使用由文档组成的集合。这些文档是使用对象字面量语法创建的。



二、工程需求

      Django 通过mongoengine库调用mongoDB,由于mongoengine底层使用的是pymongo库,所以安装mongoengine的时候一定要安装与其版本配套的pymongo版本。几条命令,分别用于安装pymongo,mongodb,关/开mongodb服务,若easy_install安装不成功,就要安装easy_install工具:



    easy_install pymongo  
    apt-get install mongodb  
    service mongodb stop/start  

第一部分:

pymongo



    <pre name="code" class="html">import pymongo  
    con=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支持(除非你有兴趣给它贡献代码)


于是我还是用了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()

...其他的举一反三,边用边找




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-37850-1-1.html 上篇帖子: 【MongoDB】MongoDB之优化器Profiler 下篇帖子: Mongodb后台daemon方式启动(一直运行) python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表