Flask 插件系列 -- Flask-MongoEngine
RigCheung
8年前
<p>MongoDB 是一个文档型数据库,是 NoSQL (not only SQL) 的一种,具有灵活、易扩展等诸多优点,受到许多开发者的青睐。 MongoEngine 是一个用来操作 MongoDB 的 ORM 框架,如果你不知道什么是 ORM,可以参考 Flask-SQLAlchemy 一节。在 Flask 中,我们可以直接使用 MongoEngine,也可使用 Flask-MongoEngine ,它使得在 Flask 中使用 MongoEngine 变得更加简单。</p> <h2>安装</h2> <p>使用 pip 安装,如下:</p> <pre> <code class="language-python">$ pipinstallflask-mongoengine </code></pre> <h2>使用</h2> <p>在使用之前,请确保 mongo 服务已经开启。</p> <h2>配置</h2> <p>我们需要配置 MongoDB 的相关参数,以便我们能访问数据库。</p> <pre> <code class="language-python"># -*- coding: utf-8 -*- from flaskimport Flask from flask_mongoengineimport MongoEngine app = Flask(__name__) app.config['MONGODB_SETTINGS'] = { 'db': 'test', 'host': '127.0.0.1', 'port': 27017 } db = MongoEngine(app) </code></pre> <p>上面的代码中,我们在 app.config 的 MONGODB_SETTINGS 字典中配置了数据库、主机和端口。如果数据库需要身份验证,那我们需要在该字典中添加 username 和 password 参数,比如:</p> <pre> <code class="language-python">app.config['MONGODB_SETTINGS'] = { 'db': 'test', 'username':'admin', 'password':'12345' } </code></pre> <p>另外,上面的配置也可以改成下面的方式:</p> <pre> <code class="language-python">p.config['MONGODB_DB'] = 'test' app.config['MONGODB_HOST'] = '127.0.0.1' app.config['MONGODB_PORT'] = 27017 app.config['MONGODB_USERNAME'] = 'admin' app.config['MONGODB_PASSWORD'] = '12345' </code></pre> <p>如果我们想在应用初始化前配置数据库,比如使用工厂方法,可以类似这样做:</p> <pre> <code class="language-python">from flaskimport Flask from flask_mongoengineimport MongoEngine db = MongoEngine() ... app = Flask(__name__) app.config.from_pyfile('config.json') db.init_app(app) </code></pre> <h2>定义数据模型</h2> <p>接下来,我们需要定义数据模型。这里,我们以一个 Todo 数据库为例,数据模型定义如下:</p> <pre> <code class="language-python">from datetime import datetime class Todo(db.Document): meta = { 'collection': 'todo', 'ordering': ['-create_at'], 'strict': False, } task = db.StringField() create_at = db.DateTimeField(default=datetime.now) is_completed = db.BooleanField(default=False) </code></pre> <p>在上面的代码中,我们定义了一个 Todo 类, meta 字典设置了 collection , ordering 和 strict ,其中 ordering 的值可以指定你的 QuerySet 的默认顺序, strict 的值指定是否使用严格模式,默认值是 True ,也就是使用严格模式,这就意味着如果数据库的记录如果存在某些字段没有在我们的数据模型中声明,那程序在运行时会产生一个 FieldDoesNotExist 的错误。因此,我们的数据模型定义最好跟记录中的字段保持一致。</p> <h2>查询数据</h2> <ul> <li>查询所有数据使用 all() 方法 <pre> <code class="language-python">todos = Todo.objects().all() </code></pre> </li> <li>查询满足某些条件的数据 <pre> <code class="language-python">task = 'cooking' todo = Todo.objects(task=task).first() </code></pre> 其中, first() 方法会取出满足条件的第 1 条记录。</li> </ul> <h2>添加数据</h2> <ul> <li> <p>添加数据使用 save() 方法</p> <pre> <code class="language-python">todo1 = Todo(task='task 1', is_completed=False) todo1.save() </code></pre> </li> </ul> <h2>数据排序</h2> <ul> <li> <p>排序使用 order_by() 方法</p> <pre> <code class="language-python">todos = Todo.objects().order_by('create_at') </code></pre> </li> </ul> <h2>更新数据</h2> <ul> <li> <p>更新数据需要先查找数据,然后再更新</p> <pre> <code class="language-python">task = 'task 1' todo = Todo.objects(task=task).first() # 先查找 if not todo: return "the task doesn't exist!" todo.update(is_completed=True) # 再更新 </code></pre> </li> </ul> <h2>删除数据</h2> <ul> <li> <p>删除数据使用 delete() 方法:先查找,再删除</p> <pre> <code class="language-python">task = 'task 6' todo = Todo.objects(task=task).first() # 先查找 if not todo: return "the task doesn't exist!" todo.delete() # 再删除 </code></pre> </li> </ul> <h2>分页</h2> <ul> <li> <p>分页可结合使用 skip() 和 limit() 方法</p> <pre> <code class="language-python">skip_nums = 1 limit = 3 todos = Todo.objects().order_by( '-create_at' ).skip( skip_nums ).limit( limit ) </code></pre> </li> </ul> <ul> <li> <p>使用 paginate() 方法</p> <pre> <code class="language-python">def view_todos(page=1): todos = Todo.objects.paginate(page=page, per_page=10) </code></pre> </li> </ul> <p> </p> <p> </p> <p>来自:http://python.jobbole.com/87121/</p> <p> </p>