跳转到主要内容

同步/异步MongoDB ODM,是的。

项目描述

μMongo: 同步/异步ODM

Latest version Python versions marshmallow 3 only License Build status Documentation

μMongo是Python MongoDB ODM。它的诞生源于两个需求:缺乏异步ODM以及使用现有ODM进行文档(反)序列化的困难。

从这一点出发,μMongo做出了一些设计选择

  • 尽可能接近MongoDB驱动标准,以保持相同的API:使用find({"field": "value"})像往常一样,但以优雅的OO封装检索您的数据!

  • 与多个驱动程序(目前包括PyMongoTxMongomotor_asynciomongomock)一起工作

  • Marshmallow序列化库紧密集成,以便轻松地将数据导入和导出到外部世界

  • 国际化集成以本地化验证错误消息

  • 自由软件:MIT许可证

  • 测试覆盖率90%+;-)

µMongo需要MongoDB 4.2+和Python 3.7+。

快速示例

import datetime as dt
from pymongo import MongoClient
from umongo import Document, fields, validate
from umongo.frameworks import PyMongoInstance

db = MongoClient().test
instance = PyMongoInstance(db)

@instance.register
class User(Document):
    email = fields.EmailField(required=True, unique=True)
    birthday = fields.DateTimeField(validate=validate.Range(min=dt.datetime(1900, 1, 1)))
    friends = fields.ListField(fields.ReferenceField("User"))

    class Meta:
        collection_name = "user"

# Make sure that unique indexes are created
User.ensure_indexes()

goku = User(email='goku@sayen.com', birthday=dt.datetime(1984, 11, 20))
goku.commit()
vegeta = User(email='vegeta@over9000.com', friends=[goku])
vegeta.commit()

vegeta.friends
# <object umongo.data_objects.List([<object umongo.dal.pymongo.PyMongoReference(document=User, pk=ObjectId('5717568613adf27be6363f78'))>])>
vegeta.dump()
# {id': '570ddb311d41c89cabceeddc', 'email': 'vegeta@over9000.com', friends': ['570ddb2a1d41c89cabceeddb']}
User.find_one({"email": 'goku@sayen.com'})
# <object Document __main__.User({'id': ObjectId('570ddb2a1d41c89cabceeddb'), 'friends': <object umongo.data_objects.List([])>,
#                                 'email': 'goku@sayen.com', 'birthday': datetime.datetime(1984, 11, 20, 0, 0)})>

现在获取

$ pip install umongo           # This installs umongo with pymongo
$ pip install my-mongo-driver  # Other MongoDB drivers must be installed manually

或者与您计划使用的MongoDB驱动程序一起获取

$ pip install umongo[motor]
$ pip install umongo[txmongo]
$ pip install umongo[mongomock]

历史

3.1.0 (2021-12-23)

功能

  • 将字段列表添加到DocumentEmbeddedDocument.__dir__()中(见#367)。

错误修复

  • 通过比较None来测试数据库,而不是转换为bool,以防止pymongo >= 4抛出的异常(见#366)。

3.0.1 (2021-10-16)

错误修复

  • 修复ListField.insert:触发set_modified,使用内部字段反序列化(见#364)。

3.0.0 (2021-01-11)

功能

  • 修复容器字段(DictField、ListField、NestedField)生成的marshmallow字段的国际化(见#329)。

  • 不要将字段元数据作为kwargs传递(已在marshmallow 3.10.0中弃用),而是作为metadata参数传递(见#328)。

错误修复

  • 修复对引用、列表和嵌入式文档中None的IO验证(见#330)。

  • 添加_dict_io_validate以通过DictField传播IO验证(见#335)。

其他更改

  • 不向后兼容:要求marshmallow >= 3.10.0(见#328)。

3.0.0b14(2020-12-08)

功能

  • 为每个框架提供Instance子类,以帮助用户将数据库从umongo 2迁移到umongo 3(见#319)。

  • 不向后兼容:将嵌入式文档解析推迟到EmbeddedField中,以便在注册之前将嵌入式文档作为字符串传递。现在在运行时而不是注册时检测EmbeddedField中的未知嵌入式文档错误。此外,索引现在在第一次使用时收集,而不是在注册时收集,应通过Document.indexes缓存的属性而不是Document.opts.indexes来访问。 (见#322)

  • 不向后兼容:使BaseSchema有序。这修复了嵌入式文档的查询。同时使BaseMarshmallowSchema有序。 (见#323)

  • 不向后兼容:使RemoveMissingSchema可取消选择。默认情况下,生成的纯marshmallow模式现在会跳过来自Document实例的缺失值,而不是返回None。可以通过设置MA_BASE_SCHEMA_CLS来更改此设置。 (见#325)

3.0.0b13(2020-11-23)

错误修复

  • 修复了3.0.0b12中引入的错误,该错误阻止了以DB作为参数进行实例初始化,如instance = PyMongoInstance(db)。 (见#318)

3.0.0b12(2020-11-16)

功能

  • 不向后兼容:重新设计Instance:将BaseInstanceInstanceLazyLoaderInstance合并为一个单一的抽象Instance类。从Instance中删除templates参数。将Instance.init重命名为Instance.set_db。不要在umongo顶层模块中重新发布具体的框架实例。 (见#314)

  • session上下文管理器添加到PyMongoInstanceMotorAsyncIOInstance。这允许使用来自umongo的会话相关功能(因果一致读取、事务)。 (见#315)

3.0.0b11(2020-11-06)

功能

  • 不向后兼容:允许在DocumentEmbeddedDocument实例上设置任意属性。此更改是重构的一部分,旨在简化对文档对象的set / get / delete操作,并略微提高性能。 (见#272)

  • 使用与DuplicateKeyError一起提供的结构化信息,而不是解析错误消息字符串(见#309)。

  • replace参数添加到commit方法中,以便强制写入整个文档而不是更新(见#310)。

其他更改

  • 支持Python 3.9(见#311)。

  • 向后不兼容:弃用对motor<2.0.0的支持(见#312)。

  • 向后不兼容:弃用对MongoDB<4.2的支持(见#313)。

3.0.0b10(2020-10-12)

功能

  • 允许在查询中传递DocumentEmbeddedDocument。(见#303)

3.0.0b9(2020-10-05)

功能

  • 添加对motor 2.2的支持(见#294)。(从2.3.0中选取。)

  • 向后不兼容:添加ExposeMissing上下文管理器,在导出时返回missing而不是None。将FromUmongoSchema替换为RemoveMissingSchema。此模式在导出时通过内部使用ExposeMissing来删除缺失的字段。通过要求用户指定RemoveMissingSchemaMA_BASE_SCHEMA_CLS来启用此功能。(见#261)

  • 向后不兼容:从Schema.as_marshmallow_schema中移除mongo_world参数。此方法生成的模式旨在(反)序列化umongo对象,而不是直接从数据库中序列化(反序列化)dict。(见#299)

  • 向后不兼容:移除umongo.Schema。模式应继承自umongo.abstract.BaseSchema。将RemoveMissingSchema公开为umongo.RemoveMissingSchema。(见#301)

其他更改

  • 向后不兼容:弃用对Python 3.6的支持(见#298)。

3.0.0b8(2020-07-22)

功能

  • Document继承自EmbeddedDocument(见#266)。

  • 添加允许DocumentEmbeddedDocument从mixin对象继承字段和前后方法的MixinDocument。(见#278)

  • 向后不兼容:移除BaseInstance.register方法的as_attribute参数。文档不能再作为实例属性通过名称访问。(见#290)

错误修复

  • 修复将None传递给具有_required_validate方法的字段(见#289)。

3.0.0b7(2020-05-08)

功能

  • 向后不兼容:撤销在3.0.0b6中引入的损坏功能,该功能允许从mixin类获取字段(见#273)。

  • 向后不兼容:移除allow_inheritance选项。任何DocumentEmbeddedDocument都可以被继承(见#270)。

  • 向后不兼容Field在传递缺失的kwarg时引发DocumentDefinitionError而不是RuntimeError,而当传递给数据库中不存在的文档的conditions时,Document.commit引发NotCreatedError(见#275)。

3.0.0b6(2020-05-04)

功能

  • 向后不兼容abstractEmbeddedDocument中的行为与Document一致。仅在具体嵌入式文档子类化具体嵌入式文档时才添加_cls / cls字段。并且EmbeddedField只接受具体嵌入式文档。(见#86)

  • DocumentEmbeddedDocument可以从mixin类继承。mixin类应首先(最左边)出现在基类中:class MyDocument(MyMixin, Document)。(见#188)

其他更改

  • 向后不兼容:代码中的marshmallow导入都作为import marshmallow as ma执行。为了方便,missingValidationError仍可以作为umongo.missingumongo.ValidationError导入。

3.0.0b5(2020-04-30)

功能

  • 向后不兼容:向 DocumentEmbeddedDocument 添加 MA_BASE_SCHEMA_CLS 类属性,用于在 as_marshmallow_schema 中指定基类。删除 as_marshmallow_schemacheck_unknown_fieldsparamsmeta 属性。将 mongo_world 设置为关键字参数。使用基模式类可以达到相同的效果。这意外地修复了 as_marshmallow_schema 缓存功能。(见 #263)

  • 向后不兼容:添加 TxMongoDocument.find_with_cursor 并停止对上游已弃用的 find(cursor=True) 的支持。(见 #259)。

其他更改

  • 向后不兼容:要求 txmongo>=19.2.0(见 #259)。

3.0.0b4(2020-04-27)

功能

  • 向后不兼容:删除部分加载功能(见 #256)。

  • 向后不兼容:添加 Document.pk_field 并删除 BaseDataProxy.*_by_mongo_name 方法(见 #257)。

  • 向后不兼容:当修改已创建文档的 pk 时引发 AlreadyCreatedError(见 #258)。

3.0.0b3(2020-04-26)

功能

  • 向后不兼容:将 ReferenceError 替换为 NoneReferenceError。审查从根 umongo 模块可导入的异常列表。(见 #251)

错误修复

  • 在调用 set_by_mongo_name 时,如果字段未在部分加载中加载,则不要修改数据。(见 #253)

其他更改

  • 向后不兼容:删除对 Python 3.5 的支持(见 #248)。

3.0.0b2(2020-04-18)

功能

  • 在 DictField 中使用字段作为键/值(见 #245)。

错误修复

  • 修复 BaseField.__repr__(见 #247)。

3.0.0b1(2020-03-29)

功能

  • 支持 marshmallow 3(见 #154)。

  • 所有以 "marshmallow_" 开头的字段参数都传递给 marshmallow 模式,而不是仅传递已知参数列表。(见 #228)

其他更改

  • 向后不兼容:删除对 marshmallow 2 的支持。请参阅 marshmallow 升级指南,以获取更改的完整列表。(见 #154)

  • 向后不兼容:由于 marshmallow 现在提供 NaiveDateTimeFieldAwareDateTimeField,因此删除 StrictDateTimeField。(见 #154)

  • 向后不兼容:现在应提供反序列化形式的 default。(见 #154)

2.3.0 (2020-09-06)

功能

  • 添加对 motor 2.2 的支持(见 #294)。

2.2.0 (2019-12-18)

错误修复

  • 修复 find/find_one:将 filter 作为第一个位置参数传递(见 #215)。

其他更改

  • 支持 Python 3.8(见 #210)。

2.1.1 (2019-10-04)

错误修复

  • 修复 ObjectId 奖励字段:在反序列化时捕获 TypeError(见 #207)。

2.1.0 (2019-06-19)

功能

  • 通过向 MotorAsyncIODocument 类添加 count_documents 类方法来添加对 motor 2.+ 的支持。 count_documents 尝试根据已安装的驱动程序版本透明地使用正确的 motor 调用签名。请注意,由 MotorAsyncIODocument.find 返回的游标对象的行为严格遵循底层驱动程序提供的接口。

2.0.5 (2019-06-13)

错误修复

  • 确保 ReferenceGenericReference 字段往返(见 #200)。

2.0.4 (2019-05-28)

错误修复

  • BaseDataProxy.get_modified_fieldsBaseDataProxy.get_modified_fields_by_mongo_name 中包含修改后的 BaseDataObject(见 #195)。

  • List.is_modified 中始终返回布尔值(见 #195)。

  • List:当使用内置的 del 操作符删除元素时调用 set_modified(见 #195)。

2.0.3 (2019-04-10)

错误修复

  • 修复 StrictDateTimeField 中当毫秒四舍五入到 1 秒时的毫秒溢出(见 #189)。

2.0.2 (2019-04-10)

错误修复

  • 修复在DateTimeFieldLocalDateTimeField中毫秒四舍五入到1秒时的毫秒溢出问题(参见#189)。

2.0.1 (2019-03-25)

错误修复

  • 修复包含重写_deserialize_from_mongo字段的EmbeddedDocument的反序列化问题(参见#186)。

2.0.0 (2019-03-18)

功能

  • 不兼容回退:umongo字段中不再使用missing属性,只使用default。可以使用marshmallow_missingmarshmallow_default属性来覆盖使用as_marshmallow_field方法返回的纯marshmallow字段中的值(参见#36和#107)。

  • 不兼容回退as_marshmallow_field不再将load_fromdump_toattribute传递给纯marshmallow字段。它只传递validaterequiredallow_nonedump_onlyload_onlyerror_messages,以及从umongo的default推断出的defaultmissing值。umongo字段中以marshmallow_为前缀的参数传递给纯marshmallow字段,并覆盖其非前缀对应项。(参见#170)

  • 不兼容回退DictFieldListField不默认为空Dict/List。为了保持旧行为,请传递默认的dict/list。 (参见#105)

  • 不兼容回退:序列化空Dict/List为空,而不是缺失(参见#105)。

  • DateTimeFieldLocalDateTimeFieldStrictDateTimeField中的日期时间四舍五入到毫秒精度,以保持对象和数据库表示的一致性(参见#172和#175)。

  • 添加DateField(参见#178)。

错误修复

  • 修复将默认值作为原始Python dict/list传递给DictField/ListField的问题(参见#78)。

  • 字段的default参数将被反序列化和验证(参见#174)。

其他更改

  • 支持Python 3.7(参见#181)。

  • 不兼容回退:取消对Python 3.4的支持(参见#176),并在asyncio框架中仅使用async/await协程样式(参见#179)。

1.2.0 (2019-02-08)

  • Schema缓存添加到as_marshmallow_schema(参见#165)。

  • 添加DecimalField。此字段仅适用于MongoDB 3.4+。(参见#162)

1.1.0 (2019-01-14)

  • 修复在Document子类的find查询中按id筛选时的错误(参见#145)。

  • 修复__getattr__以允许复制和深拷贝Document和EmbeddedDocument(参见#157)。

  • 添加Document.clone()方法(参见#158)。

1.0.0 (2018-11-29)

  • 当在数据库中找到未知字段且未使用BaseNonStrictDataProxy时,引发UnknownFieldInDBError(参见#121)

  • 修复使用mongomock时使用WrappedCursor的垃圾收集器中的(非致命)崩溃

  • 依赖于pymongo 3.7+(参见#149)

  • as_marshmallow_schema params传递给嵌套模式。自这次更改以来,每个字段的as_marshmallow_schema方法都应该期望未知**kwargs(参见#101)。

  • 将参数传递给ListField.as_marshmallow_schema中的容器字段(参见#150)

  • meta关键字参数添加到as_marshmallow_schema以传递用于模式Meta类的属性字典(参见#151)

0.15.0 (2017-08-15)

  • 将(嵌入式)DocumentOpts中的strict选项添加,允许从Mongo加载具有未知字段的文档(参见#115)

  • 修复当allow_none为True时字段序列化和反序列化的问题(参见#69)

  • 修复从另一个ReferenceField分配ReferenceFild的问题(见#110)

  • 修复通过属性代理的字段删除问题(见#109)

  • 修复StrictDateTime奖金字段:_deserialize不接受datetime.datetime实例(见#106)

  • 向Reference.fetch添加force_reload参数(见#96)

0.14.0 (2017-03-03)

  • 修复mashmallow标签处理中的错误(见#90)

  • 修复DataProxy.set中的allow none(见#89)

  • 支持motor 1.1(见#87)

0.13.0 (2017-01-02)

  • 修复嵌套EmbeddedDocuments的序列化错误(见#84, #67)

  • 向EmbeddedDocument添加选项

  • 移除buggy 参数(见#73, #74)

0.12.0 (2016-11-11)

  • 替换并修复孙子继承问题(见#66)

  • 修复motor 1.0发布后与破坏API的依赖关系

0.11.0 (2016-11-02)

  • data_objects Dict和List继承自内置的dict和list

  • Document&EmbeddedDocument将初始化期间传入的字段存储为修改过的(见#50)

  • 嵌套文档内的必填字段处理正确(见#61)

  • Document支持marshmallow的预处理和后处理

0.10.0 (2016-09-29)

  • 添加预/后更新/插入/删除钩子(见#22)

  • 使用schema.as_marshmallow_schema()和field.as_marshmallow_field()提供Umongo到Marshmallow schema/field的转换(见#34)

  • 列表和字典现在继承自collections的UserList和UserDict而不是内置类型(否则需要解决元编程冲突)

  • DeleteError和UpdateError返回驱动结果对象而不是原始错误字典(除motor外,它只有原始错误字典)

0.9.0 (2016-06-11)

  • 查询现在可以使用文档的字段名称而不是数据库中的名称来表示

  • 在使用之前也需要由一个实例进行注册

0.8.1 (2016-05-19)

  • 替换(见#14)

0.8.0 (2016-05-18)

  • 项目进行了大量重写,API损坏严重

  • 文档现在首先作为模板定义,然后在实例内部实现

  • DALs已被框架的Builder实现所取代

  • 修复Pymongo.Cursor包装器的<__getitem__>

  • 向Document.commit添加参数

  • 向txmongo添加方法

0.7.8 (2016-4-28)

  • 修复setup.py样式,防止发布版本0.7.7

0.7.7 (2016-4-28)

  • 修复与Reference.fetch相关的await错误

  • Pymongo现在仅在umongo的额外版本中安装

0.7.6 (2016-4-28)

  • 使用extras_require与umongo一起安装驱动

0.7.5 (2016-4-23)

  • 修复motor-asyncio的await(Python >= 3.5)支持

0.7.4 (2016-4-21)

  • 修复setup.py中缺失的包

0.7.3 (2016-4-21)

  • 修复setup.py样式,防止发布

0.7.2 (2016-4-21)

  • 修复在EmbeddedDocument上生成索引时的崩溃

0.7.1 (2016-4-21)

  • 修复setup.py不安装测试包

  • 传递状态到Beta

0.7.0 (2016-4-21)

  • 添加i18n支持

  • 添加MongoMock支持

  • 文档已经大幅扩展

0.6.1 (2016-4-13)

  • _lazy_loader添加到配置Document的lazy_collection

0.6.0 (2016-4-12)

  • 各方面都有重大改进!

0.1.0 (2016-1-22)

  • PyPI上的首个版本。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源分布

umongo-3.1.0.tar.gz (100.3 kB 查看哈希值)

上传时间

构建分布

umongo-3.1.0-py2.py3-none-any.whl (50.5 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面