用于Python的轻量级Mongodb ODM / ORM

问题描述 投票:10回答:4

我正在寻找从两个世界中获得最佳效果的MongoDB Python ODM / ORM:ODM / ORM和超快速直接字典读取。

换句话说,包装应符合以下要求:

  1. 允许定义和实施架构。
  2. 允许验证字段。
  3. 允许直接从mongodb读取对象(无ODM / ORM开销)。 可以使用ODM / ORM层(没有额外查询)访问由pymongo直接返回的集合/对象。 我想象一下pymongo驱动程序添加了一些懒惰的字段到可以访问ORM果汁的对象(pymongo允许这样的扩展)。 想象一下用例: 为了快速阅读,我们直接去司机, 对于数据输入,我们使用完整的ODM / ORM功能
  4. Geofields支持
  5. GridFS支持普通文件和图像
  6. DBRef支持
  7. 不强制执行任何隐藏的特定于框架的字段
  8. 将与Flask合作:)
  9. 有表格框架。 表格涵盖了子列表/细分 基于骨干的表单会很棒
  10. 根据python定义创建骨干模型,集合和验证器

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

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

python mongodb backbone.js flask pymongo
4个回答
7
投票

首先,我也喜欢拥有它。

根据我的研究

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

MongoEngine太大了,无法根据您的要求/用例进行调整。 MongoKit也是如此。

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

可能是一个很好的起点。

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


3
投票

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

我认为你必须检查this post的答案,检查所提出的建议是否是你需要的,我个人直接使用MongoDB + Python,因为Mongo和Python的“本质”。

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


3
投票

umongo在问到这个问题后很久就出生了。虽然相对年轻,但它正在逐渐成熟。与micromongo一样,它的目标是简单(“u”代表μ/ micro),因此它不提供问题中所要求的众多功能,但它意味着要构建的理想基础。

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

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

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


0
投票

看看pymongoext https://github.com/musyoka-morris/pymongoext,它的灵感来自于猫鼬。

主要特点是:

  • 没有要学习的自定义查询语言或API(如果你知道如何使用pymongo,你已经知道如何使用pymongoext)
  • 类似于对象的结果而不是像dict一样。这些对象扩展了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': '[email protected]', 'name': 'Jane Doe', 'yob': 1990})

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

# Print the users age
>>> print(user.age)
© www.soinside.com 2019 - 2024. All rights reserved.