Docs 主页 → 开发应用程序 → Python 驱动程序 → pymongo
第三方工具
Overview
本页介绍了使用 PyMongo 的一些流行的第三方库。 除 Motor 外,此页面上的所有库均由社区维护。 为了保持此列表的最新性,最近未更新的项目偶尔会从列表中删除或移动到最后。
提示
尽管这些库可能很有用,但我们建议 PyMongo 新用户从直接使用驱动程序开始。 仅 PyMongo 就可以满足大多数人的需求,使用它对了解 MongoDB 的工作原理很有启发。
类 ORM 层
类 ORM(类对象关系映射)层为 PyMongo 添加了模型和验证等功能。
MincePy 是一个对象文档映射器 (ODM),旨在使任何Python 对象可在 中存储和查询。MongoDB database它在设计时考虑了机器学习和大数据计算和实验科学应用。 但是,它是完全通用的,对于任何希望在尽可能少地改变当前工作流程的情况下组织、共享或处理大量数据的人来说都是非常有用的。
明 是一个库,允许您在MongoDB database Python应用程序中对 实施模式。它由 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 框架和库配合使用的工具和适配器。
Django
即使没有 Django 后端,您也可以将 MongoDB 和 PyMongo 与 Django 提供的大部分功能一起使用。 仅使用 MongoDB 时,需要 django.db
的 Django 某些功能(例如管理、身份验证和会话)将不起作用。
DjangoMongoDB 引擎 是适用于MongoDB database Django 的 后端,支持 Django 聚合、原子更新、嵌入式对象、Map/Reduce 和 GridFS。它允许您使用 Django 的大部分内置功能,包括 ORM、管理、身份验证、站点和会话框架以及缓存。 有关更多信息,请参阅 MongoDB 引擎教程。
Django MongoEngine 是 Django 的 MongoDB 后端。该存储库还包括一个 示例应用程序 。有关更多信息,请参阅 Django MongoEngine 文档。
Djongo 是一个connector ,用于将MongoDB 用作数据库后端的 Django。借助 Djongo,您可以使用 Django 管理 GUI 在 MongoDB 中添加和修改文档。 Djongo 源代码 托管在Github 上,并且 Djongo 包 在 PyPI 上。
mango 为 Django 会话和身份验证提供 MongoDB 后端(完全绕过
django.db
)。
Flask
Flask-MongoAlchemy 使用 MongoAlchemy 添加对 MongoDB 的 Flask 支持。
Flask-MongoKit 是一个 Flask 扩展,旨在更好地将 MongoKit 集成到 Flask 中。
Flask-PyMongo 连接 Flask 和 PyMongo。
其他工具
记录4mongo 是一个灵活的Python 日志记录处理程序,可以使用普通集合和固定大小集合在MongoDB 中存储日志。
mongobox 是一个从 Python 应用程序中运行沙盒 MongoDB 实例的工具。
mongodb_beaker 使您能够将 MongoDB 用作 Beaker 的 后端 缓存和会话系统。来源位于Github 上。
MongoLog 是一个 Python 日志记录处理程序,它使用固定大小集合将日志存储在 MongoDB 中。
rod.recipe.mongodb 是一个 构建 下载和安装 MongoDB 的诀窍。
互操作性工具
本部分列出了支持与其他工具互操作的工具。
gevent
PyMongo 使用 Python 标准库中的线程和套接字函数。 使用 gevent ,PyMongo 可以使用非阻塞套接字执行异步 I/O,并在 greenlet 上调度操作 而不是线程。
要将 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
将使用 greenlet 而不是线程来监控服务器的运行状况。 关闭时,如果应用程序在没有先终止这些 greenlet 的情况下调用~gevent.hub.Hub.join()
方法,则对~gevent.hub.Hub.join()
方法的调用会无限期阻塞。
为避免这种情况,请在退出应用程序之前关闭或取消引用任何活动的MongoClient
对象。 在某些应用程序框架中,您可以使用信号处理程序在应用程序收到SIGHUP
时结束后台 greenlet,如以下示例所示:
import signal def graceful_reload(signum, traceback): """Explicitly close some global MongoClient object.""" client.close() signal.signal(signal.SIGHUP, graceful_reload)
此问题会影响使用早于1.9.16的 uWSGI 版本或带有-gevent-wait-for-hub
选项的较新 uWSGI 版本的应用程序。 有关更多信息,请参阅 uWSGI 变更日志。
mod_wsgi
mod_wsgi 软件包提供了一个 Apache 模块,该模块实现了符合 WSGI 的接口,用于在 Apache Web 服务器上托管基于 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 的文档中解释了这些困难 在 多个 Python 子解释器 中 mod_wsgi 文档部分。
替代 Python 驱动程序
本节列出了 PyMongo 的替代方案。