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 的全栈应用程序。
日志4 Mongo 是一种灵活的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 版本或带有 选项的较新 uWSGI-gevent-wait-for-hub
版本的应用程序。有关更多信息,请参阅 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 的替代方案。
Motor是一款功能齐全的非阻塞MongoDB驾驶员,适用于Python Tornado 应用程序。
TxMongo 是适用于MongoDB的异步 Twisted Python驾驶员。
MongoMock 是一个用于帮助测试Python代码的小型库。它使用PyMongo与MongoDB交互。