mongodb在python中的应用——利用pymongo和mongoengine

一、前文

          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 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时它的可用度来看,实际生产环境使用还是很困难。比如说:

  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()

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




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。