(点击
上方公众号
,可快速关注)
来源:FunHacks
funhacks.net/2016/11/08/flask_mongoengine/
如有好文章投稿,请点击 → 这里了解详情
简介
MongoDB 是一个文档型数据库,是 NoSQL (not only SQL) 的一种,具有灵活、易扩展等诸多优点,受到许多开发者的青睐。MongoEngine 是一个用来操作 MongoDB 的 ORM 框架,如果你不知道什么是 ORM,可以参考
Flask-SQLAlchemy 一节
。在 Flask 中,我们可以直接使用 MongoEngine,也可使用 Flask-MongoEngine ,它使得在 Flask 中使用 MongoEngine 变得更加简单。
安装
使用 pip 安装,如下:
$ pip install flask-mongoengine
使用
在使用之前,请确保 mongo 服务已经开启。
配置
我们需要配置 MongoDB 的相关参数,以便我们能访问数据库。
# -*- coding: utf-8 -*-
from
flask
import
Flask
from
flask_mongoengine
import
MongoEngine
app
=
Flask
(
__name__
)
app
.
config
[
'MONGODB_SETTINGS'
]
=
{
'db'
:
'test'
,
'host'
:
'127.0.0.1'
,
'port'
:
27017
}
db
=
MongoEngine
(
app
)
上面的代码中,我们在 app.config 的 MONGODB_SETTINGS 字典中配置了数据库、主机和端口。如果数据库需要身份验证,那我们需要在该字典中添加 username 和 password 参数,比如:
app
.
config
[
'MONGODB_SETTINGS'
]
=
{
'db'
:
'test'
,
'username'
:
'admin'
,
'password'
:
'12345'
}
另外,上面的配置也可以改成下面的方式:
app
.
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'
如果我们想在应用初始化前配置数据库,比如使用工厂方法,可以类似这样做:
from
flask
import
Flask
from
flask_mongoengine
import
MongoEngine
db
=
MongoEngine
()
...
app
=
Flask
(
__name__
)
app
.
config
.
from_pyfile
(
'config.json'
)
db
.
init_app
(
app
)
定义数据模型
接下来,我们需要定义数据模型。这里,我们以一个 Todo 数据库为例,数据模型定义如下:
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
)
在上面的代码中,我们定义了一个 Todo 类,meta 字典设置了 collection,ordering 和 strict,其中 ordering 的值可以指定你的 QuerySet 的默认顺序,strict 的值指定是否使用严格模式,默认值是 True,也就是使用严格模式,这就意味着如果数据库的记录如果存在某些字段没有在我们的数据模型中声明,那程序在运行时会产生一个 FieldDoesNotExist 的错误。因此,我们的数据模型定义最好跟记录中的字段保持一致。
查询数据
todos = Todo.objects().all()
task
=
'cooking'
todo
=
Todo
.
objects
(
task
=
task
).
first
()
其中,first() 方法会取出满足条件的第 1 条记录。
添加数据
todo1
=
Todo
(
task
=
'task 1'
,
is_completed
=
False
)
todo1
.
save
()
数据排序
todos = Todo.objects().order_by('create_at')
更新数据
task
=
'task 1'
todo
=
Todo
.
objects
(
task
=
task
).
first
()
# 先查找
if
not
todo
:
return
"the task doesn't exist!"
todo
.
update
(
is_completed
=