Sqlalchemy Hierarchical Key/Value Helper

metalchem的Python项目详细描述


metalchemy:sqlalchemy分层键/值助手

metalchemy包为sqlalchemy模型添加动态属性提供帮助。

https://api.travis-ci.org/paylogic/metalchemy.pnghttps://pypip.in/v/metalchemy/badge.pnghttps://coveralls.io/repos/paylogic/metalchemy/badge.png?branch=master

安装

pip install metalchemy

使用量

金属化学使用示例:

fromsqlalchemy.ext.declarativeimportdeclarative_baseBase=declarative_base()importmetalchemymetalchemy_attributes=metalchemy.initialize(Base)Session=sessionmaker(bind=engine)sess=Session()classMyModel(Base)meta=metalchemy_attributes.Metadata()my_object=MyModel()my_object.meta.some.value='some value'sess.add(my_object)sess.commit()sess.refresh(my_object)assertmy_object.meta.some.value.get_value()=='some value'

为了提供类元数据功能,向它添加一个类属性,它是一个实例 元数据的数量:

classHasMetadata(object):meta=metadata.Metadata()

此类的任何实例现在都可以通过meta属性访问其元数据。

这种元属性允许自由读取和分配属性,对属性的深度没有限制。 也就是说,meta.foo始终可用于读写,但也可用于meta.foo.bar.baz,而无需事先进行任何设置。

分配给元数据属性很简单 显而易见:

inst.meta.foo=42inst.meta.foo.bar.baz='qux'

任何元数据属性也隐式地是一个数组。可以从任何 索引:

inst.meta.foo[0]=42inst.meta.foo[1]='baz'inst.meta.foo[1].bar='qux'inst.meta.foo[1].spam[2]='eggs'inst.meta.foo[1][2]='xyzzy'

任何未索引的属性都隐式转换为零索引。

所有元数据值在赋值时都转换为Unicode字符串。赋值将自动添加到 sqlalchemy会话,但未提交,因此请记住执行session.commit()。 此外,方法FieldWrapper.appendFieldWrapper.iteritemsFieldWrapper.__iter__ 也支持直接迭代。

回读值需要使用get_value方法:

inst.meta.foo.get_value()# returns 42inst.meta.foo.bar.baz.get_value()# returns u'qux'

内部构件: 字段的层次结构存储在相邻列表中(由<;\u fields>;表示),该列表是唯一的 一个班级。类的所有实例都共享此树。一个对象将类名映射到此树, 并设置为在需要时立即加载整个树。

分配给容器类的<;metadata>;实例将加载<;\u对象>;(并隐式加载字段层次结构) 访问并返回包装的根节点。

<;fieldwrappers>;包装每个字段,执行两个功能: -它们允许访问还没有具体实例的字段,并根据需要创建这些字段 -它们实际上访问特定容器类实例的值列表。

值存储在一个平面列表中,该列表在第一次需要时完全为容器类实例加载。

数组支持由两种状态FieldWrappers处理:正则和索引。

常规包装器包装未编制索引的属性。它处理对其属性的数组元素的读写 (FieldWrapper.__getitem__FieldWrapper.__setitem__),并将属性访问延迟到自己的第0个索引。

索引包装器包装索引属性。这个包装器通过返回属性访问的包装器 子属性。索引包装器也可以被索引,但这是在内部通过推迟二级索引来完成的。 隐藏的子属性。即,访问meta.foo[0][1][2]在内部处理为访问 meta.foo[0].<hidden>[1].<hidden>[2]

警告

  • 在分配元数据之前,必须将主键设置为其值。这意味着在分配元数据之前,它们必须至少刷新一次。

接触

如果您有问题、错误报告、建议等,请在 那张GitHub project page

许可证

本软件在MIT license

License

版权所有2014 Paylogic International。

更改日志

1.0.0

  • 首次公开发行

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

推荐PyPI第三方库


热门话题
java对角差分   不满意链接错误:org。opencv。海吉。海吉。imread_0(OpenCV Java)   java在Eclipse中使用mavenreleaseplugin   java在加载时冻结JVM/Tomcat,而safepointlog记录使用safepoints“ThreadStop”条目   c#在visual studio中进行调试时是否可以像在eclipse(java)中那样编辑代码   java更改生成的jaxb类的类名和包结构   java我怎样才能同时使用JTextField和JLabel?   Java swing使用按钮更改包含图标的标签的颜色   java如何实例化。我在运行时得到的类文件   java无法使用XPath为站点160by2定位WebElements mobile和message box。com和way2sms。通用域名格式   java将MYSQL日期时间值转换为UTC时区格式yyyyMMdd'T'HH:mm:ss'Z'   java在Bundle中,如何找到给定键的值的类型?   使用Java流使用数据库游标   java阻止在过滤适配器数据时重新加载图像[Android]