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工具:

1
2
3
easy_install pymongo
apt-get install mongodb
service mongodb stop/start

第一部分:

pymongo

1
2
3
4
5
import pymongo
con=pymongo.Connection('127.0.0.1',27017) #连接到数据库
db=con.cimcc #获取数据库
db.authenticate('username','password')
collection=db.cimcc_user #获得表

举例子应用:

1.查找

1
collection.find({'level':2,'userid':int(float(item))})

返回list,下面2有示例

2.降序排序,获取键值

1
2
for i in collection.find().sort([("userid",-1)]):
userid=i['userid']+userid

3.插入数据项

1
collection.insert({'userid':1})

4.更新

1
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,效果也还行。

1
2
3
4
5
6
7
8
9
10
11
12
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

1
cimc_message.objects.get_or_create(msg_from='admin',to='xiaoming',msg_type='type1',status=0,defaults=msg_dic)

找到匹配条件就返回该条数据,否则就插入defaults,defaults为字典

2.delete

1
cimc_message.objects(msg_from='admin',to='xiaoming',msg_type='type1',status=0).delete()

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

Comments