我最近一直在做一些关于Pylons的工作,非常喜欢用于数据库交互的SQLAlchemy模型。我的网站上有一部分我认为可以从EAV模式中获益。在
以以下表格为例:
id | userid | type | value
---+--------+--------|------------
1 | 1 | phone | 111 111 111
---+--------+--------|------------
2 | 1 | age | 40
我可以手动运行以下查询来提取和更新数据:
^{pr2}$这很简单而且有效。。。但是手工构造查询并不是我的首选方法。我想使用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)
然后我可以使用以下方法提取数据:
data = Session.query(People).filter_by(id=1).first()
print data.age
我希望能够对我的EAV模式做同样的事情。所以基本上,我需要一种扩展SQLAlchemy的方法,告诉它当我调用data.age
时,实际上意味着,我想要SELECT value FROM table WHERE id=1 AND type='age'
。在
这可行吗?或者我会被迫用手动发出的查询来混乱我的代码吗?在
看一下vertical attribute mapping的示例。我想这或多或少就是你想要的。这些示例提供了一个dict类的接口,而不是您的示例中的属性(可能更适合于任意元数据键,而不是一些特定的属性)。在
如果您希望分别映射每个属性:文档中可能感兴趣的内容:
uselist=False
(因为每个用户只有一个年龄,所以您需要一个值,而不是一个列表)将_age
与KeyValue(或任何您想调用它的名称)建立关系。然后可以使用age = association_proxy('_age', 'value')
使其仅“显示”值,而不是整个KeyValue对象。在我想我要么使用基于垂直属性映射示例的方法,要么使用associationproxy/
相关问题 更多 >
编程相关推荐