SQLAlchemy分层键/值助手
项目描述
metalchemy:SQLAlchemy分层键/值助手
metalchemy包为您的SQLAlchemy模型提供助手,以添加动态属性。
安装
pip install metalchemy
用法
metalchemy用法示例
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
import metalchemy
metalchemy_attributes = metalchemy.initialize(Base)
Session = sessionmaker(bind=engine)
sess = Session()
class MyModel(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)
assert my_object.meta.some.value.get_value() == 'some value'
为了给一个类添加元数据功能,请向它添加一个属性,该属性是
class HasMetadata(object):
meta = metadata.Metadata()
此类的任何实例现在都可以通过meta属性访问其元数据。
此类元属性允许自由读取和分配属性,没有属性深度的限制。例如,meta.foo始终可用于读取和写入,也可以是meta.foo.bar.baz,无需事先设置。
分配元数据属性简单明了
inst.meta.foo = 42
inst.meta.foo.bar.baz = 'qux'
任何元数据属性也隐式地是一个数组。可以从中分配和读取任何索引
inst.meta.foo[0] = 42
inst.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 42
inst.meta.foo.bar.baz.get_value() # returns u'qux'
内部结构:字段的层次结构存储在一个邻接表中(由_Fields表示),这是针对单个类的,一个类的所有实例共享这个相同的树。一个_Object将类名映射到这个树,并在需要时一次性加载整个树。
分配给容器类的Metadata实例在访问时会加载_Object(以及隐式地,字段层次结构),并返回一个包装的根节点。
FieldWrappers包装每个_Field,执行两个功能:- 允许访问尚未有具体_Field实例的字段,并在需要时创建这些实例 - 实际访问特定容器类实例的值列表。
值存储在一个扁平列表中,在第一次需要时,会完全加载容器类实例。
数组支持通过两种状态的FieldWrappers来处理:常规和索引。
常规包装器包装未索引的属性。它在其属性上处理数组的读写操作(FieldWrapper.__getitem__和FieldWrapper.__setitem__),并将属性访问推迟到其自己的零索引。
索引包装器包装索引属性。此包装器通过返回该子属性的包装器来处理属性访问。索引包装器也可以被索引,但这是通过将二级索引推迟到隐藏的子属性内部来完成的。例如,访问meta.foo[0][1][2]在内部被处理为访问meta.foo[0].hidden[1].hidden[2]。
联系
如果您有任何问题、错误报告、建议等,请在GitHub项目页面上创建一个问题。
许可
本软件根据MIT许可证授权。
查看许可证
© 2014 Paylogic International.
更改日志
1.0.0
首次公开发布
项目详情
metalchemy-1.0.0.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 5e22626166dfcd27f708bb58837a61e61901e2fdadb68a4a97d295ad7193d733 |
|
MD5 | 992ac30f7763674620b06d36d53f7655 |
|
BLAKE2b-256 | 43a53c3e31ba2e1f633c6126b0130b0da9b6d13ab8b22b65dbca2839af7d25f6 |