第三方工具
概述
此页面描述了与PyMongo一起使用的一些流行的第三方库。除Motor外,本页面上所有库均由社区维护。为了保持此列表最新,最近未更新的项目有时将从列表中删除或移至末尾。
提示
尽管这些库可能很有帮助,但我们建议新的PyMongo用户首先直接与驱动程序一起工作。PyMongo本身将满足大多数人的需求,并且使用它有助于了解MongoDB的工作方式。
ORM-like 层
ORM-like(对象关系映射-like)层为PyMongo添加了模型和验证等功能。
MincePy 是一个对象-文档映射器(ODM),旨在使任何 Python 对象都可以在 MongoDB 数据库中存储和查询。它是为了考虑机器学习和大数据计算与实验科学应用而设计的。然而,它是完全通用的,对于希望以尽可能少改变当前工作流程的方式组织、共享或处理大量数据的任何人来说都是有用的。
Ming 是一个库,它允许你在 Python 应用程序中强制执行 MongoDB 数据库的模式。它是由 SourceForge 在他们的 MongoDB 迁移过程中开发的。详见 入门博客文章 了解更多细节。
MongoEngine 允许您使用受Django ORM启发的语法来定义文档模式和查询集合。代码可在 GitHub 上找到。
MotorEngine 是MongoEngine到Motor的端口,允许使用Tornado进行异步访问。它以数据可移植的方式实现了相同的建模API,这意味着在MongoEngine中定义的模型可以在MotorEngine中被读取。源代码可在GitHub上找到。
uMongo 是一个用于满足两个需求的 Python MongoDB ODM:缺乏异步 ODM 和其他 ODM 序列化文档的难度。uMongo 与多个驱动程序一起工作:PyMongo、TxMongo、motor_asyncio 和 mongomock。源代码可在 GitHub
框架工具
本节列出了设计用于与各种 Python 框架和库一起工作的工具和适配器。
Python的Django
即使没有Django后端,您也可以使用MongoDB和PyMongo与Django提供的多数功能一起使用。当仅使用MongoDB时,Django的一些需要django.db
的功能,如管理、身份验证和会话,将无法工作。
Django MongoDB Engine 是Django的MongoDB数据库后端,支持Django聚合、原子更新、内嵌对象、Map/Reduce和GridFS。它允许您使用Django的大部分内置功能,包括ORM、管理、身份验证、站点和会话框架,以及缓存。更多信息请参阅Django MongoDB Engine教程
Django MongoEngine 是 Django 的 MongoDB 后端。仓库还包括一个 示例应用。更多信息请参阅 Django MongoEngine 文档
Djongo 是一个用于使用 MongoDB 作为数据库后端的 Django 连接器。使用 Djongo,您可以使用 Django Admin GUI 添加和修改 MongoDB 中的文档。您可以在 GitHub 上找到 Djongo 源代码,并且 Djongo 包 在 PyPI 上。
mango 为 Django 会话和身份验证提供 MongoDB 后端(完全绕过
django.db
)。
Flask
Flask-MongoAlchemy 为 Flask 添加了通过 MongoAlchemy 对 MongoDB 的支持。
Flask-MongoKit 是一个Flask扩展,用于更好地将MongoKit集成到Flask中。
Flask-PyMongo 连接Flask和PyMongo。
其他工具
全栈FastAPI应用生成器可以帮助您快速搭建一个集成了FastAPI、React和MongoDB的全栈应用程序。
Log4Mongo是一个灵活的Python日志处理程序,可以使用普通和限制集合将日志存储在MongoDB中。
mongobox是一个工具,可以在Python应用程序中运行沙盒化的MongoDB实例。
mongodb_beaker 允许您将 MongoDB 作为 Beaker 缓存和会话系统的后端。源代码位于 GitHub。
MongoLog 是一个使用 MongoDB 的 capped collection 存储日志的 Python 日志处理程序。
rod.recipe.mongodb 是一个用于下载和安装 MongoDB 的 Buildout 配方。
互操作性工具
本节列出了支持与其他工具互操作性的工具。
gevent
PyMongo 使用 Python 标准库中的线程和套接字函数。通过使用 gevent,PyMongo 可以使用非阻塞套接字进行异步 I/O,并在 greenlets 上调度操作,而不是使用线程。
要使用 gevent 与 PyMongo,在加载任何其他模块之前调用 gevent 的 monkey.patch_all()
方法,如下面的示例所示
# You must call patch_all() *before* importing any other modules from gevent import monkey _ = monkey.patch_all() from pymongo import MongoClient client = MongoClient()
重要
关闭 MongoClient 以避免阻塞
如果您在应用程序启动时调用 monkey.patch_all()
,则 MongoClient
将使用 greenlets 而不是线程来监控服务器的健康状态。当关闭时,如果您的应用程序在首先终止这些 greenlets 之前调用 ~gevent.hub.Hub.join()
方法,则对 ~gevent.hub.Hub.join()
方法的调用将无限期地阻塞。
为了避免这种情况,在退出应用程序之前关闭或取消引用任何活动的 MongoClient
对象。在某些应用程序框架中,您可以使用信号处理器在应用程序收到 SIGHUP
时结束后台 greenlets,如下面的示例所示
import signal def graceful_reload(signum, traceback): """Explicitly close some global MongoClient object.""" client.close() signal.signal(signal.SIGHUP, graceful_reload)
此问题会影响使用 uWSGI 版本早于 1.9.16 或带有 -gevent-wait-for-hub
选项的新版本 uWSGI 的应用程序。有关更多信息,请参阅 uWSGI 更新日志。
mod_wsgi
mod_wsgi 软件包提供了一种 Apache 模块,该模块实现了 WSGI 兼容接口,用于在 Apache 网络服务器上托管基于 Python 的 Web 应用程序。
要在 mod_wsgi 下运行您的 PyMongo 应用程序,请遵循以下指南
使用
WSGIDaemonProcess
指令以守护进程模式运行 mod_wsgi。如果您的 mod_wsgi 配置仅包括WSGIScriptAlias
指令,它将以嵌入式模式运行。使用
WSGIApplicationGroup %{GLOBAL}
指令以确保您的应用程序在守护进程的主 Python 解释器中运行,而不是子解释器中。这避免了在子解释器中解码 BSON 产生的小成本。使用
WSGIProcessGroup
指令将每个应用程序分配给单独的守护进程。这确保应用程序不会相互影响状态。
以下mod_wsgi配置示例展示了如何使用前面的指令来运行您的PyMongo应用程序
<VirtualHost *> WSGIDaemonProcess my_process WSGIScriptAlias /my_app /path/to/app.wsgi WSGIProcessGroup my_process WSGIApplicationGroup %{GLOBAL} </VirtualHost>
如果您有多个PyMongo应用程序,请将每个应用程序放入全局应用组中的单独守护进程
<VirtualHost *> WSGIDaemonProcess my_process WSGIScriptAlias /my_app /path/to/app.wsgi <Location /my_app> WSGIProcessGroup my_process </Location> WSGIDaemonProcess my_other_process WSGIScriptAlias /my_other_app /path/to/other_app.wsgi <Location /my_other_app> WSGIProcessGroup my_other_process </Location> WSGIApplicationGroup %{GLOBAL} </VirtualHost>
注意
许多Python C扩展在多个Python子解释器中运行时存在问题。这些困难在Py_NewInterpreter和mod_wsgi文档中的多个Python子解释器部分中进行了说明。
替代Python驱动程序
本节列出了PyMongo的替代方案。