一、前文
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时它的可用度来看,实际生产环境使用还是很困难。比如说:
- 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()
...其他的举一反三,边用边找