Python SQLAlchemy:转换自引用联接、计数、按选择分组

Python SQLAlchemy:转换自引用联接、计数、按选择分组,python,sqlalchemy,Python,Sqlalchemy,我花了一天的时间才得到一条SQL Select语句,该语句可以应用到等价的SQLAlchemy代码中。它包括两张桌子 桌子 class Tags(Base): __tablename__ = 't_tags' uid = Column(Integer, primary_key=True) category = Column(Enum('service', 'event', 'attribute', name='enum

我花了一天的时间才得到一条SQL Select语句,该语句可以应用到等价的SQLAlchemy代码中。它包括两张桌子

桌子

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")
事件uid是标识父级的唯一字符串

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

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
如果能得到任何帮助,我将不胜感激,因为经过一整天的努力,我甚至还没能让某些东西发挥作用


最亲切的问候

这应该可以完成这项工作:

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)
        )

但是你也可以使用基于
关系
连接
而不是简单的
WHERE
子句。

非常感谢@van-这非常有效-我显然把它复杂化了。