一个不引人注目的数据建模、操作和验证库。包括MongoDB。
monk的Python项目详细描述
一个不引人注目的数据建模、操作和验证库。
支持MongoDB开箱即用。可用于任何其他数据库(甚至没有数据库)。
安装
$ pip install monk
依赖关系
monk是针对以下版本的python进行测试的:
- cpython 2.6、2.7、3.2、3.4
- Pypy 2.0
可选依赖项:
- MongoDB扩展需要pymongo。
文档
有关详细信息,请参见完整的documentation。
示例
建模
模式被定义为使用本机python数据类型的模板:
# we will reuse this structure in examples below spec = { 'title': 'Untitled', 'comments': [ { 'author': str, 'date': datetime.datetime.utcnow, 'text': str } ], }
您可以根据需要自由设计复杂的文档。 操作和验证函数(如下所述)支持 任意嵌套结构。
当这种“自然”的Python疗法还不够时,你可以把它与 更详细的符号,例如:
title_spec = IsA(str, default='Untitled') | Equals(None)
还有一些简洁的快捷方式:
spec = { 'url': nullable(str), 'status': one_of(['new', 'in progress', 'closed']), 'comments': [str], 'blob': None, }
这可以写得更详细一些:
spec = { 'url': IsA(str) | Equals(None), 'status': Equals('new') | Equals('in progress') | Equals('closed'), 'comments': ListOf(IsA(str)), 'blob': Anything(), }
甚至可以为字典键定义模式:
CATEGORIES = ['books', 'films', 'toys'] spec = { 'title': str, optional('price'): float, # key is optional; value is mandatory 'similar_items': { one_of(CATEGORIES): [ # suggestions grouped by category {'url': str, 'title': str} ], } } # (what if the categories should be populated dynamically? # well, the schema is plain Python data, just copy/update on the fly.)
是的,你可以混合符号。请参见常见问题解答。
这个非常简短的介绍显示monk需要几乎0的学习 启动,然后在需要时提供非常强大的工具; 你不必重写“直觉”代码,只会增加复杂性。 确切地说是不可避免的地方。
操作
架构可用于从不完整数据创建完整文档:
frommonkimportmerge_defaults# default values are set for missing keys>>>merge_defaults(spec,{}){'title':'Untitled','comments':[],}# it's easy to override the defaults>>>merge_defaults(spec,{'title':'Hello'}){'title':'Hello','comments':[],}# nested lists of dictionaries can be auto-filled, too.# by the way, note the date.>>>merge_defaults(spec,{'comments':[{'author':'john'}]}){'title':'Untitled','comments':[{'author':'john','date':datetime.datetime(2013,3,3,1,8,4,152113),'text':None,}]}
验证
可以使用相同的架构来确保文档具有正确的结构 值的类型正确:
frommonk.validationimportvalidate# correct data: staying silent>>>validate(spec,data)# a key is missing>>>validate(spec,{'title':'Hello'})Traceback(mostrecentcalllast):...MissingKey:'comments'# a key is missing in a dictionary in a nested list>>>validate(spec,{'comments':[{'author':'john'}]}Traceback(mostrecentcalllast):...MissingKey:'comments':#0: 'date'# type check; also works with functions and methods (by return value)>>>validate(spec,{'title':123,'comments':[]})Traceback(mostrecentcalllast):...ValidationError:'title':mustbestr
可以使用自定义验证器。行为可以微调。
validate()函数将“自然”符号转换为验证器 在引擎盖下的物体。为了提高性能,您可以“编译”验证器 一次(使用translate()函数或就地创建验证器实例) 并多次使用它来验证不同的值:
>>> from monk import * >>> translate(str) == IsA(str) True >>> validator = IsA(str) | IsA(int) >>> validator('hello') >>> validator(123) >>> validator(5.5) Traceback (most recent call last): ... AllFailed: 5.5 (must be str; must be int)
这个库也可以看作是构建odm的框架。 (对象文档映射器)。查看MongoDB扩展并注意它如何重用 由DB不可知模块提供的MIXIN。
下面是MongoDB ODM与Monk捆绑的一个例子:
from monk.mongo import Document class Item(Document): structure = dict(text=unicode, slug=unicode) indexes = dict(text=None, slug=dict(unique=True)) # this involves manipulation (inserting missing fields) item = Item(text=u'foo', slug=u'bar') # this involves validation item.save(db)
链接
- Project home page(github)
- Documentation(阅读文档)
- Package distribution(pypi)
- 问题、请求、错误报告等:
- Issue tracker
- 直接电子邮件(Gmail com上的neiThere)
许可
Monk是自由软件:您可以重新发布和/或修改它 根据已发布的GNU Lesser通用公共许可条款 由自由软件基金会,许可证的第3版,或者 (由您选择)任何更高版本。
蒙克被分发是希望它会有用, 但没有任何保证;甚至没有 适销性或适合某一特定目的的适销性。见 GNU Lesser通用公共许可证了解更多详细信息。
你应该收到GNU Lesser通用公共许可证的副本 和蒙克一起。如果没有,请参见<;http://gnu.org/licenses/>;。