Flask扩展系列(五)–MongoDB

MongoDB是一个文档型数据库,它灵活的Schema,多层次的数据结构和JSON格式的文档使得其已经成为了NoSQL阵营的领头羊。Flask的MongoDB扩展有很多,比如Flask-MongoAlchemy,基于MongoAlchemy实现,非常类似于上一篇所介绍的SQLAlchemy;Flask-MongoKit,基于MongoKit实现,同MongoAlchemy类似,需要预先定义数据模型。不过MongoDB的一大优势就是数据模型,即Collection,是灵活的,如果可以不限制数据模型的字段,将会更大程度的发挥MongoDB的优势,Python的PyMongo框架就可以做到这个。本篇我们就要介绍基于PyMongo实现的Flask扩展,Flask-PyMongo。

系列文章

安装和启用

首先,建议读者先去了解下PyMongo的基本用法。

我们通过pip安装Flask-PyMongo扩展:

$ pip install Flask-PyMongo

安装完后,查看下PyMongo的版本,本文中的例子必须跑在PyMongo 3.0.x以上:

$ pip list | grep pymongo

然后采用下面的方法初始化一个Flask-PyMongo的实例:

在应用配置中,我们指定了MongoDB的服务器地址,端口,数据库名,用户名和密码。对于上面的配置,我们也可以简化为:

在同一应用中,我们还可以初始化两个以上的Flask-PyMongo实例,分别基于不同的配置项:

当调用初始化方法”PyMongo()”时,传入”config_prefix”参数,该PyMongo实例就会使用以”MONGO_TEST”为前缀的配置项,而不是默认的”MONGO”前缀,比如上例中的”MONGO_TEST_URI”。

添加数据

MongoDB中的表叫做集合(Collection),表中的记录叫做文档(Document)。一个文档记录就是一个JSON对象,对于Python来说,就是一个字典。下面的代码就会在”users”集合中添加一条文档记录:

如果”users”集合不存在,PyMongo会自动创建。让我们打开MongoDB的控制台,查询下刚才添加的文档:

> use flask
> db.users.find()

你应该会看到类似下面的信息:

MongoDB会自动为文档记录创建一个主键”_id”,它的值是一个uuid。你也可以在创建文档时获取这个值:

“mongo.db.users”用来获取名为”users”集合对象,类型是”pymongo.collection.Collection”,该对象上的”insert_one()”方法用来创建一条记录。相应的,集合对象上的”insert_many()”方法可以同时创建多条记录,比如:

查询下tests的集合,你会看到类似下面的信息:

查询数据

集合对象提供了”find_one()”和”find()”方法分别用来获取一条和多条文档记录,两个方法都可以传入查询条件作为参数:

上例中的模板文件”users.html”如下:

“find_one()”方法返回的就是一个字典,所以我们可以直接对其作操作。”find()”方法返回的其实是一个”pymongo.cursor.Cursor”对象,不过Cursor类实现了”__iter__()”和”next()”方法,因此可以用”for … in …”循环来遍历它。

Cursor类还提供了很多功能接口来强化查询功能,这里列举一些常用的:

  1. “count()”方法, 获取返回数据集的大小
  2. “sort()”方法, 排序
  3. “limit()”和”skip()”方法, 分页
  4. “distinct()”方法, 获取某一字段的唯一值
  5. 注意,”distinct()”方法需传入字段名,它返回的是一个列表,而不是Cursor或文档。上例列出了’age’字段所有的唯一值。

更多对Cursor的操作可参阅PyMongo的Cursor API文档

更新数据

“pymongo.collection.Collection”提供了两种更新数据的方法,一种是update,可以更新指定文档中某个字段的值,同关系型数据库中的update类似。update有两个函数,”update_one()”更新一条记录,”update_many()”更新多条记录:

另一种更新数据的方法是replace,它不是用来更新某一字段,而是把整条记录替换掉。它就一个函数”replace_one()”:

删除数据

删除数据可以使用集合对象上的delete方法,它也有两个函数,”delete_one()”删除一条记录,”delete_many()”删除多条记录:

如果你想将集合整个删除,可以使用”drop()”方法:

此后你在MongoDB控制台里输入命令”show tables”,将看不到这个”users”集合。

更多对集合中的数据操作可参阅PyMongo的Collection API文档

练习:PyMongo结合Restful

我们来做个小练习,在扩展系列第一篇中我们介绍过Flask-Restful的实现,并且让大家做了练习将Restful同数据库集成。现在让我们把数据库改为MongoDB,使用上面介绍的Flask-PyMongo来实现。下面是参考代码:

这里我们使用name作为键值来查询,因为MongoDB中的id太复杂。注意,我们在输出时都会把”_id”字段去掉,因为它是”ObjectId”类型无法JSON序列化,同时如果你的数据中有日期时间类型,也要特别处理后才能被JSON序列化。

更多参考资料

PyMongo的官方文档
Flask-PyMongo的官方文档
Flask-PyMongo的源码

本篇的示例代码可以在这里下载

《Flask扩展系列(五)–MongoDB》有3个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注