文档菜单

文档首页开发应用程序Python 驱动程序PyMongo

第三方工具

本页内容

  • 概述
  • ORM 类层
  • 框架工具
  • Django
  • Flask
  • 其他工具
  • 互操作性工具
  • gevent
  • mod_wsgi
  • 其他 Python 驱动程序

此页面描述了一些流行的第三方库,用于与 PyMongo 一起工作。除了 Motor 之外,本页上的所有库都由社区维护。为了保持列表的最新性,偶尔会从列表中删除或移动未更新较久的项目。

提示

尽管这些库可能有帮助,但我们建议新的 PyMongo 用户从直接与驱动程序一起工作开始。PyMongo 本身就能满足大多数人的需求,与之一起工作可以了解 MongoDB 的工作方式。

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后端,您也可以使用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)。

  • Log4Mongo 是一个灵活的 Python 日志处理程序,可以使用普通和 capped 集合将日志存储在 MongoDB 中。

  • mongobox 是一个工具,可以从 Python 应用程序内部运行沙盒化的 MongoDB 实例。

  • mongodb_beaker 允许您将 MongoDB 用作 Beaker 缓存和会话系统的后端。源代码位于 GitHub.

  • MongoLog 是一个使用 MongoDB 的 capped 集合来存储日志的 Python 日志处理器。

  • rod.recipe.mongodb 是一个用于下载和安装 MongoDB 的 Buildout 配方。

本节列出了支持与其他工具互操作性的工具。

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包提供了一个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子解释器》部分中有解释。

本节列出了PyMongo的替代方案。

  • Motor 是一个功能齐全的非阻塞 MongoDB 驱动程序,用于 Python Tornado 应用程序。

  • TxMongo 是一个用于 MongoDB 的异步 Twisted Python 驱动程序。

  • MongoMock 是一个小型库,用于帮助测试 Python 代码。它使用 PyMongo 与 MongoDB 交互。

← 通用唯一标识符 (UUIDs)