之前在上汽大众做Flask
技术培训的时候,有一个学员问我怎么在Flask
中使用MongoDB
,虽然MySQL
数据库是Flask
框架的标配,但是在某些业务场景下MongoDB
是更加合适的。举个上汽大众真实项目的例子,他们需要做一个零件管理系统,其中零件的某些字段是固定的,比如名称、类型,生产日期等,但是不同的零件会有不同的属性,而且零件的种类会持续的发生变化,这种业务场景下用MySQL
虽然可以实现,但不是最佳方案。最佳方案就是MongoDB
。MongoDB
是一个文档型数据库,是NoSQL (not only SQL)
的一种,具有灵活、易扩展等特点,他的每条数据的字段都可以不一样,对于这样的业务场景再合适不过了,存储方便,查询也方便。
那在Flask
中如何优雅的操作MongoDB
呢?可以使用MongoEngine
库,他是一个用来操作MongoDB
的ORM
框架。在Flask
中,我们也可使用Flask-MongoEngine
,它使得在Flask
中使用MongoEngine
变得更加简单。
老套路,使用使用 pip
安装,如下:
$ pip install flask-mongoengine
当然,在使用之前,请确保mongo
服务已经开启。关于MongoDB
的安装,这里不做过多讲解,相信这点小事对于你来说没有任何问题。
配置好连接MongoDB
的MONGODB_SETTINGS
参数,必须设置的是db
、host
和port
:
from flask importFlask
from flask_mongoengine importMongoEngine
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',
'host':'127.0.0.1',
'port':27017
'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'
配置好了连接后,我们来看下如何定义数据模型。这里,我们以一个Todo
数据库为例,数据模型定义如下:
from datetime import datetime
classTodo(db.Document):
meta ={
'collection':'todo',
'ordering':['-create_at'],
'strict':False,
}
task = db.StringField()
create_time = db.DateTimeField(default=datetime.now)
is_completed = db.BooleanField(default=False)
在上面的代码中,我们定义了一个 Todo
类,meta
字典设置了 collection
,ordering
和 strict
,其中 ordering
的值可以指定你的 QuerySet
的默认顺序,strict
的值指定是否使用严格模式,默认值是 True
,也就是使用严格模式,这就意味着如果数据库的记录如果存在某些字段没有在我们的数据模型中声明,那程序在运行时会产生一个 FieldDoesNotExist
的错误。因此,我们的数据模型定义最好跟记录中的字段保持一致。后面就分别定义了三个字段task
、create_time
、is_completed
,字段定义的方式与Flask-SQLAlchemy
非常的类似,是不是有一种亲切感!
Flask-MongoEngine
支持以下字段类型:
查询数据的方式,也跟Flask-SQLAlchemy
类似,只不过不是通过query
,而是通过objects
,这点与Django
有点类似:
todos = Todo.objects().all()
也可以在查询的时候,给objects
传递一些过滤条件:
task ='cooking'
todo =Todo.objects(task=task).first()
其中,first()
方法会取出满足条件的第 1 条记录。
添加数据使用 save()
方法,比如:
todo1 = Todo(task='task 1', is_completed=False)
todo1.save()
排序使用 order_by()
方法,比如:
todos =Todo.objects().order_by('create_time')
更新数据直接调用模型对象的update
方法即可。比如:
task ='task 1'
todo = Todo.objects(task=task).first()
if not todo:
return"the task doesn't exist!"
todo.update(is_completed=True)
删除数据也是直接调用模型对象的delete
方法即可。比如:
task ='task 6'
todo = Todo.objects(task=task).first()# 先查找
todo.delete()# 再删除
分页可结合使用 skip()
和 limit()
方法,比如:
todos = Todo.objects().order_by('-create_at').skip(1).limit(3)
或者是直接使用 paginate()
方法,比如:
def view_todos(page=1):
todos = Todo.objects.paginate(page=page, per_page=10)
以上便是Flask-MongoEngine
插件的基本使用,一篇文章我们不求你能对这个插件有多精通,但是能让你多了解一些平常工作之外的技术,万一遇到类似需求的时候,你能知道有这个技术解决方案。这才是关注我们公众号,和我们一起成长的意义所在。