Sqlalchemy Hierarchical Key/Value Helper
metalchem的Python项目详细描述
metalchemy:sqlalchemy分层键/值助手
metalchemy包为sqlalchemy模型添加动态属性提供帮助。
安装
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.append
、FieldWrapper.iteritems
和FieldWrapper.__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。
更改日志
1.0.0
- 首次公开发行