0

我一直在努力获得一个适用于等效 SQLAlchemy 代码的 SQL Select 语句。它涉及两个表。

一个标签表

class Tags(Base):
    __tablename__ = 't_tags'
    uid                 = Column(Integer, primary_key=True)
    category            = Column(Enum('service', 'event', 'attribute', name='enum_tag_category'))
    name                = Column(String(32))

以及一张将他们映射到其原始父母的表格

class R_Incident_Tags(Base):
    __tablename__ ='r_incident_tags'
    incident_uid        = Column(String(48), ForeignKey('t_incident.uid'), primary_key=True)
    tag_uid             = Column(Integer, ForeignKey('t_tags.uid'), primary_key=True)

    tag = relationship("Tags", backref="r_incident_tags")

event_uid 是用于标识父级的唯一字符串。

我一直在努力在 SQLAlchemy 中表示的 SELECT 如下

SELECT DISTINCT s.name, e.name, count(e.name)
    FROM "t_tags" AS s,
         "t_tags" AS e,
         "r_incident_tags" AS sr,
         "r_incident_tags" AS er
    WHERE   s.category='service' AND
            e.category='event' AND
            e.uid = er.tag_uid AND
            s.uid = sr.tag_uid AND
            er.incident_uid = sr.incident_uid
    GROUP BY s.name, e.name

任何帮助都将不胜感激,因为经过一整天的努力,我什至还没有接近完成工作。

最亲切的问候!

4

1 回答 1

1

这应该做的工作:

s = aliased(Tags)
e = aliased(Tags)
sr = aliased(R_Incident_Tags)
er = aliased(R_Incident_Tags)

qry = (session.query(s.name, e.name, func.count(e.name)).
        select_from(s, e, sr, er).
        filter(s.category=='service').
        filter(e.category=='event').
        filter(e.uid == er.tag_uid).
        filter(s.uid == sr.tag_uid).
        filter(er.incident_uid == sr.incident_uid).
        group_by(s.name, e.name)
        )

但是您也可以使用relationship-basedJOIN代替简单的WHERE子句。

于 2013-03-08T09:48:17.737 回答