17

我正在寻找从两个世界中汲取精华的 MondoDB Python ODM/ORM:ODM/ORM 和超快速直接字典读取。

换言之,包装应符合以下要求:

  1. 允许定义和执行模式。
  2. 允许验证字段。
  3. 允许直接从 mongodb 读取对象(无 ODM/ORM 开销)。
    • pymongo 直接返回的集合/对象可以使用 ODM/ORM 层访问(没有额外的查询)。
    • 我会想象 pymongo 驱动程序向提供对 ORM 汁液访问的对象添加了某种惰性字段(pymongo 允许此类扩展)。
    • 想象一下用例:
      • 为了快速阅读,我们直接转到驱动程序,
      • 对于数据输入,我们使用完整的 ODM/ORM 功能
  4. 地质场支持
  5. GridFS 对普通文件和图像的支持
  6. DBRef 支持
  7. 不强制执行任何隐藏的、特定于框架的字段
  8. 将与 Flask 一起使用 :)
  9. 有表单框架。
    • 表格涵盖子列表/子目录
    • 基于主干的表单会很棒
  10. 基于 python 定义创建主干模型、集合、验证器

我知道我要求很多,但拥有这样的东西不是很棒吗:)

事实上,问题可以改写为:“现有的哪些 Python Mongodb ODM/ORM(MongoKit、MongoEngine)可以通过这种方式轻松扩展。”

4

4 回答 4

10

首先,我也很想拥有它。

根据我的研究

Ming 是一个非常有前途的 mongo ODM 驱动程序:http: //merciless.sourceforge.net/

MongoEngine 太大而无法适应您的需求/用例。MongoKit 也是如此。

micromongo 有一些希望:http ://packages.python.org/micromongo

可能是一个很好的起点。

顺便说一句:嗯...我不知道您在写什么,但是涵盖了表单和验证器,您可以轻松地构建管理界面并最终拥有下一代 Django。祝你好运!

于 2012-04-21T19:57:12.830 回答
4

好吧,如果您采用 ORM 的理论,那么您需要的不是 ORM,因为 MongoDB 不是关系数据库,所以不需要映射到关系实体。

我认为您必须检查这篇文章的答案以检查所提出的建议是否是您所需要的,我个人直接使用 MongoDB + Python,因为 Mongo 和 Python 的“性质”。

环顾四周,我发现这个库可以帮助你mongoEngine。就像 Django ORM。你应该检查一下。

于 2012-04-20T19:16:39.830 回答
4

在提出这个问题很久之后,umongo就诞生了。虽然相对年轻,但它正在逐渐成熟。与 micromongo 一样,它的目标是简单(“u”代表 µ/micro),因此它不提供问题中要求的众多功能,但它旨在成为一个健全的基础。

它在内部使用 Marshmallow 进行模型模式/验证,因此您可以愉快地与其他使用 Marshmallow 的库一起使用它。我在一个 Flask 应用程序中使用它,该应用程序提供一个使用 Marshmallow 解析输入/输出的 REST API。这限制了 DB 和 API 模式之间的重复量。该应用程序使用 Marshmallow 环境 (webargs/apispec) 中的其他库。

由于您可以直接访问集合,因此可以使用普通的 pymongo 查询。

此外,它不仅与 pymongo 兼容,还与异步驱动程序兼容。

于 2016-11-29T09:14:16.847 回答
2

看看pymongoext https://github.com/musyoka-morris/pymongoext,它受到猫鼬的高度启发。

主要特点是:

  • 无需学习自定义查询语言或 API(如果您知道如何使用 pymongo,那么您已经知道如何使用 pymongoext)
  • 类似对象的结果而不是类似字典的结果。这些对象扩展了 dict,因此您可以使用任何一种语法(即 foo.bar 或 foo['bar'])。
  • 自定义数据操纵器,用于在保存之前和检索之后转换文档。(灵感来自猫鼬虚拟)
  • 模式验证(使用 MongoDB JSON 模式验证)
  • 嵌套和复杂的模式声明
  • 必填字段验证
  • 默认值
  • 自定义验证器
  • 验证运算符(OneOf、AllOf、AnyOf、Not)
  • 索引管理(Pymongoext透明智能地处理MongoDB索引的维护)

示例用法:

from datetime import datetime
from pymongo import MongoClient, IndexModel
from pymongoext import *


class User(Model):
    @classmethod
    def db(cls):
        return MongoClient()['my_database_name']

    __schema__ = DictField(dict(
        email=StringField(required=True),
        name=StringField(required=True),
        yob=IntField(minimum=1900, maximum=2019)
    ))

    __indexes__ = [IndexModel('email', unique=True), 'name']

    class AgeManipulator(Manipulator):
        def transform_outgoing(self, doc, model):
            doc['age'] = datetime.now().year - doc['yob']
            return doc


# Create a user
>>> User.insert_one({'email': 'jane@gmail.com', 'name': 'Jane Doe', 'yob': 1990})

# Fetch one user
>>> user = User.find_one()

# Print the users age
>>> print(user.age)
于 2019-04-13T09:00:21.020 回答