0

同等のSQLAlchemyコードで機能するSQLSelectステートメントを取得するのに1日苦労していました。2つのテーブルが含まれます。

タグテーブル

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

Incident_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ベースのを使用することもできます。JOINWHERE

于 2013-03-08T09:48:17.737 に答える