一个不引人注目的数据建模、操作和验证库。包括MongoDB。

monk的Python项目详细描述


https://badge.fury.io/py/monk.pnghttps://travis-ci.org/neithere/monk.png?branch=master

一个不引人注目的数据建模、操作和验证库。

支持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)

作者

最初由安德烈·米哈林科自2011年起撰写。

请随时提交修补程序、报告错误或请求功能:

http://github.com/neithere/monk/issues/

许可

Monk是自由软件:您可以重新发布和/或修改它 根据已发布的GNU Lesser通用公共许可条款 由自由软件基金会,许可证的第3版,或者 (由您选择)任何更高版本。

蒙克被分发是希望它会有用, 但没有任何保证;甚至没有 适销性或适合某一特定目的的适销性。见 GNU Lesser通用公共许可证了解更多详细信息。

你应该收到GNU Lesser通用公共许可证的副本 和蒙克一起。如果没有,请参见<;http://gnu.org/licenses/>;。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
ArrayList Java中的搜索字符串   另一个web应用程序的java访问会话   另一个应用程序中的活动和服务之间的java通信   java根据Json字符串类型将Json字符串转换为对象   eclipse如何解决java中的错误异常。lang.NoSuchMethodError:'java。字符串javax。摆动JOptionPane。showInputDialog(java.lang.String)'   线程“main”java中的安卓异常。lang.NoClassDefFoundError:org/codehaus/jackson/JsonParseException   java如何在安卓 emulator上显示Mat图像?使用NDK   Java在本地读取测试源文件,但在服务器上读取失败   java dowhile循环用于计算输入数字中的数字。故障排除代码   JAva初学者在编写获取成本的方法时遇到困难   java是shell游戏。我如何让物体移动,特别是在特定的曲线上,但顺序是随机的?   java如何区分两个同名的JButton   java为什么我在Spring Boot中需要一个接口?   java将文件路径插入数据库将删除\   使用InterfaceType初始化java对象   java如何部署一个分为Angular、Spring Boot和MySQL的项目?   java如何使用Symja解决不等式?