用于Python的轻量级Mongodb ODM / ORM
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于Python的轻量级Mongodb ODM / ORM相关的知识,希望对你有一定的参考价值。
我正在寻找从两个世界中获得最佳效果的MongoDB Python ODM / ORM:ODM / ORM和超快速直接字典读取。
换句话说,包装应符合以下要求:
- 允许定义和实施架构。
- 允许验证字段。
- 允许直接从mongodb读取对象(无ODM / ORM开销)。 可以使用ODM / ORM层(没有额外查询)访问由pymongo直接返回的集合/对象。 我想象一下pymongo驱动程序添加了一些懒惰的字段到可以访问ORM果汁的对象(pymongo允许这样的扩展)。 想象一下用例: 为了快速阅读,我们直接去司机, 对于数据输入,我们使用完整的ODM / ORM功能
- Geofields支持
- GridFS支持普通文件和图像
- DBRef支持
- 不强制执行任何隐藏的特定于框架的字段
- 将与Flask合作:)
- 有表格框架。 表格涵盖了子列表/细分 基于骨干的表单会很棒
- 根据python定义创建骨干模型,集合和验证器
我知道我要求的很多,但是这样的东西不会很棒:)
事实上,问题可以改为:“现有的Python Mongodb ODM / ORM(MongoKit,MongoEngine)可以通过这种方式轻松扩展。”
首先,我也喜欢拥有它。
根据我的研究
明是一个非常有前途的mongo ODM驱动程序:http://merciless.sourceforge.net/
MongoEngine太大了,无法根据您的要求/用例进行调整。 MongoKit也是如此。
micromongo有一些希望:http://packages.python.org/micromongo
可能是一个很好的起点。
顺便说一句:嗯......我不知道你在写什么,但是你可以轻松地构建管理界面并最终拥有下一代Django。祝好运!
好吧,如果你采用ORM的理论,你需要的不是ORM,因为MongoDB不是关系数据库,所以没有映射到关系实体。
我认为你必须检查this post的答案,检查所提出的建议是否是你需要的,我个人直接使用MongoDB + Python,因为Mongo和Python的“本质”。
环顾四周,我发现这个图书馆可以帮助你mongoEngine。就像Django ORM。你应该检查一下。
umongo在问到这个问题后很久就出生了。虽然相对年轻,但它正在逐渐成熟。与micromongo一样,它的目标是简单(“u”代表μ/ micro),因此它不提供问题中所要求的众多功能,但它意味着要构建的理想基础。
它在内部使用Marshmallow进行模型架构/验证,因此您可以使用Marshmallow与其他库愉快地使用它。我在Flask应用程序中使用它,它使用Marshmallow提供REST API来解析输入/输出。这限制了DB和API架构之间的重复数量。该应用程序使用Marshmallow环境中的其他库(webargs / apispec)。
由于您可以直接访问集合,因此可以使用普通的pymongo查询。
此外,它不仅与pymongo兼容,而且与异步驱动程序兼容。
看看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': 'jane@gmail.com', 'name': 'Jane Doe', 'yob': 1990})
# Fetch one user
>>> user = User.find_one()
# Print the users age
>>> print(user.age)
以上是关于用于Python的轻量级Mongodb ODM / ORM的主要内容,如果未能解决你的问题,请参考以下文章
php70-mongo 安装学说/mongodb-odm 失败
Doctrine MongoDB 在没有 ODM 的情况下使用