dav*_*ave 1 python pylons sqlalchemy entity-attribute-value
我最近一直在与Pylons做一些工作,非常像SQLAlchemy数据库交互模型.我的网站有一部分,我认为可以从EAV架构中受益.
使用它作为我的表示例:
id | userid | type | value
---+--------+--------|------------
1 | 1 | phone | 111 111 111
---+--------+--------|------------
2 | 1 | age | 40
Run Code Online (Sandbox Code Playgroud)
我可以手动运行以下查询来提取和更新数据:
SELECT value FROM table WHERE userid=1 AND type='phone'
UPDATE table SET value=41 WHERE userid=1 AND type='age'
Run Code Online (Sandbox Code Playgroud)
这很容易并且有效...但是手动构建查询不是我的首选方法.我想使用SQLAlchemy来创建我的表模型并让它完成所有的工作.
如果我使用标准架构,每个架构都有type自己的列,我可以执行以下操作:
class People(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
userid = Column(Integer, ForeignKey('users.id'))
phone = Column(Unicode(40))
age = Column(Integer)
Run Code Online (Sandbox Code Playgroud)
然后我可以使用以下方法提取数据:
data = Session.query(People).filter_by(id=1).first()
print data.age
Run Code Online (Sandbox Code Playgroud)
我希望能够为我的EAV架构做同样的事情.所以基本上,我需要一种方法来扩展SQLAlchemy并告诉它,当我调用data.age它实际上意味着,我想要SELECT value FROM table WHERE id=1 AND type='age'.
这可行吗?或者我是否会被手动发出的查询强迫我的代码混乱?
看一下垂直属性映射的示例.我认为这或多或少都是你所追求的.这些示例提供了类似于dict的界面,而不是示例中的属性(可能更适合任意元数据键,而不是几个特定属性).
如果您希望单独映射每个属性:可能感兴趣的文档中的内容:
_age使用自定义连接条件(不仅是userid,还指定类型"age")和使用uselist=False(因为有),可以与KeyValue(或任何您想要调用它)建立关系每个用户只有一个年龄,你想要一个单一的值,而不是一个列表.然后,您可以使用age = association_proxy('_age', 'value')它来"仅"显示值,而不是整个KeyValue对象.我想我会选择基于垂直属性映射示例的东西,或者使用associationproxy /
| 归档时间: |
|
| 查看次数: |
1455 次 |
| 最近记录: |