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》有8个想法

  1. If getting trouble in the installation of Norton setup then contact Norton support or norton.com/setup to get the best solution to your problem. Our representative will guide you through the Norton setup installation procedure and help you with the other error as well related to your Norton product.

发表评论

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