Overview
本页介绍了使用 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,以及使用其他 ODM 序列化文档的困难。uMongo 可与多个驱动程序配合使用: PyMongo、TxMongo、 motor_asyncio 和 mongomock。源代码可在Github上找到。
框架工具
本部分列出了设计用于与各种 Python 框架和库配合使用的工具和适配器。
Django
您可以使用官方 Django MongoDB 后端,将 MongoDB 用作 Django 应用程序中的数据库。Django MongoDB Backend 是一个 Django数据库后端,它使用PyMongo连接到MongoDB。通过使用后端,您可以使用 Django 模型来表示MongoDB文档,并支持Django 表单、验证和身份验证。Django MongoDB后端还允许您在应用程序中使用特定于MongoDB 的查询优化,例如聚合操作和索引。
重要
公开预览版
Django MongoDB后端处于公共预览阶段,仅用于评估目的。 不建议将公共预览版用于生产部署,因为可能会引入重大更改。
Flask
Flask-MongoAlchemy 通过 MongoAlchemy 添加了对MongoDB的 Flask支持。
Flask-MongoKit 是一个 Flask 扩展,旨在更好地将 MongoKit 集成到 Flask 中。
Flask-PyMongo 连接 Flask 和 PyMongo。
其他工具
全栈 FastAPI App Generator 使您能够快速启动集成了 FastAPI、 React和MongoDB 的全栈应用程序。
Log4mongo 是一个灵活的Python日志记录处理程序,可以使用普通集合和固定大小集合在MongoDB中存储日志。
mongobox 是一个从Python应用中运行沙盒MongoDB实例的工具。
mongodb_beaker 使您能够使用MongoDB作为 Beaker 缓存和会话系统的后端。来源位于Github上。
MongoLog 是一个Python日志记录处理程序,它使用固定大小集合将日志存储在MongoDB中。
rod.recipe.mongodb 是用于下载和安装 MongoDB 的 Buildout 配方。
互操作性工具
本部分列出了支持与其他工具互操作的工具。
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 文档和 mod_wsgi 文档的多个Python子解释器部分对这些困难进行了解释。
类型检查器
有关可使用类型提示检测代码错误的工具列表,请参阅 typing
模块文档中的Python静态类型化。
注意
通用文档类型的默认值在 Mypy 中尚不可用。有关导致此问题的 Mypy 限制的讨论,请参阅Mypy Github存储库。
如果您正在使用 Mypy 并希望选择不使用提供的类型,请将以下行添加到您的 Mypy 配置文件中:
[mypy-pymongo] follow_imports = False
替代 Python 驱动程序
本节列出了 PyMongo 的替代方案。