文档首页 → 开发应用程序 → Python 驱动程序 → PyMongo
第三方工具
概述
此页面描述了一些流行的第三方库,用于与 PyMongo 一起工作。除了 Motor 之外,本页上的所有库都由社区维护。为了保持列表的最新性,偶尔会从列表中删除或移动未更新较久的项目。
提示
尽管这些库可能有帮助,但我们建议新的 PyMongo 用户从直接与驱动程序一起工作开始。PyMongo 本身就能满足大多数人的需求,与之一起工作可以了解 MongoDB 的工作方式。
ORM 类层
ORM 类(对象关系映射类似)层为 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和序列化文档的困难。uMongo支持多个驱动程序:PyMongo、TxMongo、motor_asyncio和mongomock。源代码可在GitHub。上找到。
框架工具
本节列出了为与各种Python框架和库协同工作而设计的工具和适配器。
Django
即使没有Django后端,您也可以使用MongoDB和PyMongo与Django提供的大多数功能一起使用。django.db
中的某些功能,如管理、认证和会话,在仅使用MongoDB时将无法工作。
Django MongoDB 引擎 是一个 Django 的 MongoDB 数据库后端,支持 Django 聚合、原子更新、内嵌对象、Map/Reduce 和 GridFS。它允许您使用 Django 的大多数内置功能,包括 ORM、管理界面、身份验证、站点和会话框架以及缓存。更多信息请参阅 Django MongoDB 引擎教程。
Django MongoEngine 是Django的MongoDB后端。仓库还包括一个 示例应用程序。有关更多信息,请参阅 Django MongoEngine文档。
Djongo 是用于使用 MongoDB 作为数据库后端的 Django 连接器。使用 Djongo,您可以使用 Django Admin GUI 添加和修改 MongoDB 中的文档。Djongo 的 源代码 存放在 GitHub 上,而 Djongo 包 则可在 PyPI 上找到。
mango 为 Django 会话和身份验证提供 MongoDB 后端(完全绕过
django.db
)。
Flask
Flask-MongoAlchemy 为 Flask 添加了对 MongoDB 的支持,使用 MongoAlchemy。
Flask-MongoKit 是一个 Flask 扩展,用于更好地将 MongoKit 集成到 Flask。
Flask-PyMongo 用于连接 Flask 和 PyMongo。
其他工具
Log4Mongo 是一个灵活的 Python 日志处理程序,可以使用普通和 capped 集合将日志存储在 MongoDB 中。
mongobox 是一个工具,可以从 Python 应用程序内部运行沙盒化的 MongoDB 实例。
mongodb_beaker 允许您将 MongoDB 用作 Beaker 缓存和会话系统的后端。源代码位于 GitHub.
MongoLog 是一个使用 MongoDB 的 capped 集合来存储日志的 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()
方法,则该调用将无限期阻塞。
为了避免这种情况,在退出应用程序之前关闭或解除引用任何活动的MongoClient
对象。在某些应用程序框架中,您可以在应用程序收到SIGHUP
时使用信号处理程序来结束背景greenlets,如下例所示
import signal def graceful_reload(signum, traceback): """Explicitly close some global MongoClient object.""" client.close() signal.signal(signal.SIGHUP, graceful_reload)
此问题影响使用低于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的替代方案。