Python Web 7 —— python调用mongodb优化,使用mongoengine

来源:互联网 发布:js 点击显示隐藏图片 编辑:程序博客网 时间:2024/06/07 03:56

前言:

        上一篇文章中我们详细阐述了如何在python中使用pymongo来操作mongodb数据库,但是直接把对于数据库的操作代码都写在脚本中,显然会让应用的代码耦合性太强,而且不利于代码的优化管理,一般应用都是使用MVC框架来设计的,为了更好地维持MVC结构,我们需要把数据库操作部分作为model抽离出来,这就需要借助MongoEngine,这是一个可以操作MongoDB数据库的对象-文档映射器ODM,Object Document Mapper)。


一、安装mongoengine:

        安装过程其实很简单,使用pip插件来安装,在doc窗口中使用一下指令进行安装:

pip install mongoengine
        由于我们选择的web框架是flask,所以我们需要安装适用于flask的mongoengine,即flask_mongoengine,通过以下指令:

pip install flask_mongoengine


二、使用操作:

1.引入:

        引入flask_mongoengine的内容同时,将datetime也一起引入,这样保存数据的时候可以把时间戳也一并存入:

from flask_mongoengine import *from datetime import datetime
 
2.连接数据库:

        连接数据库分为两种:

        连接本地数据库:例如连接本地数据库的名字为LocalDB,可以使用:connect('LocalDB')

        连接指定ip的机器上的数据库:connect('LocalDB',host='ip地址',username='数据库用户名',passworld='密码')

3.声明数据存储结构:

        声明一个继承自MongoEngine.Document的类,在类中声明一些属性,相当于创建一个用来保存数据的数据结构,即数据已类似数据结构的形式存入数据库中,通常把这样的一些类都存放在一个脚本中,作为应用的Model模块,例如创建一个models.py脚本:

from flask import Flaskimport datetimefrom flask_mongoengine import MongoEngineapp = Flask(__name__)   #创建一个Flask应用db = MongoEngine(app)   #实例化数据库class Post(db.Document):    author = db.StringField(max_length=50)    title = db.StringField(max_length=120, required=True)    tags = db.ListField(db.StringField(max_length=30))    time = db.DateTimeField(default=datetime.datetime.now())    content = db.StringField()
        这里声明了一个类,它继承自Document类,具有五个属性,其中在声明每个属性的时候其实都可以引入required这个参数,required=True时,表示创建此类的对象时,必须对该属性进行赋值


4.保存数据:

        根据上述代码在使用Post类创建对象时,至少要对title属性进行赋初值,如下我们实现将数据插入数据库:

from models import Post #引入Post类post = Post(title="test") #创建Post对象post.author = "lsh"         #对象属性赋值post.save()                     #将数据存入数据库中
        除了将数据存入数据库,有时候我们还需要查询数据库中的数据或者是对数据库中数据进行修改,也就是进行查询更新操作,在mongoengine中这个两部操作实现方式:
        查询:posts = Post.objects.all() #返回所有的文档对象列表

                   posts = Post.objects(title="test") #返回符合查询条件的对象列表

        更新:post.title="test1" #修改对象属性

                   post.update()     #更新

0 0