我最近一直在使用 Pylons 做一些工作,很像用于数据库交互的 SQLAlchemy 模型。我认为我的网站有一个部分可以从 EAV 模式中受益。
使用它作为我的表格示例:
id | userid | type | value
---+--------+--------|------------
1 | 1 | phone | 111 111 111
---+--------+--------|------------
2 | 1 | age | 40
我可以手动运行如下查询来提取和更新数据:
SELECT value FROM table WHERE userid=1 AND type='phone'
UPDATE table SET value=41 WHERE userid=1 AND type='age'
这既简单又有效……但手动构建查询并不是我的首选方法。我想使用 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'
.
这是可行的吗?还是我会被迫用手动发出的查询来弄乱我的代码?