如何将SQLAlchemy和EAV-DB模式结合起来?

2024-06-16 13:35:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近一直在做一些关于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'。在

这可行吗?或者我会被迫用手动发出的查询来混乱我的代码吗?在


Tags: 方法模型idagedatasqlalchemyvaluetype
1条回答
网友
1楼 · 发布于 2024-06-16 13:35:38

看一下vertical attribute mapping的示例。我想这或多或少就是你想要的。这些示例提供了一个dict类的接口,而不是您的示例中的属性(可能更适合于任意元数据键,而不是一些特定的属性)。在

如果您希望分别映射每个属性:文档中可能感兴趣的内容:

  • sql expressions as mapped attributes:如何将属性映射到任意sql表达式(只读)
  • changing attribute behaviour,特别是使用描述符和自定义比较器:这可以归结为只对属性使用普通的python属性,并在get/set+上执行您需要的任何操作(有选择地指定与其他值的比较(用于查询)需要如何工作。在
  • associationproxy:基本上提供了一个更简单的关系视图。例如,在您的例子中,您可以使用自定义联接条件(不仅是userid,还可以指定类型“age”),并使用uselist=False(因为每个用户只有一个年龄,所以您需要一个值,而不是一个列表)将_age与KeyValue(或任何您想调用它的名称)建立关系。然后可以使用age = association_proxy('_age', 'value')使其仅“显示”值,而不是整个KeyValue对象。在

我想我要么使用基于垂直属性映射示例的方法,要么使用associationproxy/

相关问题 更多 >