2

私は Pyramid アプリケーションで SQLAlchemy を使用しており、次のテーブルのペアがあります。

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id          = Column(Integer, primary_key=True)
    name        = Column(String, nullable=False, default='', unique=True)
    manager     = Column(Integer, nullable=False, default=-1)

class MyStats(Base):
    __tablename__ = 'my_stats'
    id          = Column(Integer, primary_key=True)
    agent       = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
    manager     = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)

    kpi_one     = Column(Integer)
    kpi_two     = Column(Integer)

MyStats はその時点でのエージェントのマネージャーを保存します (そのため、マネージャーが誰であるかに基づいて、または好きなようにマネージャーとは別に、エージェントのパフォーマンスがどのように変化したかを確認できます)。

以下を取得するクエリを実行したいと思います。

Agent  Manager  KPI1   KPI2
Bob    Fred     1      1.1
Alice  Owain    1.2    0.9

などなど。これで、エージェント名またはマネージャー名だけでプルアップできます。

DBSession.query(User.name, MyStats.kpi_one, MyStats.kpi_two).filter(User.id == MyStats.agent)

私ができないのは、両方を同時に照会することです。私は一日の大部分をこれを解決しようとして過ごしましたが、できません。

4

1 に答える 1

7

別名テーブルを作成する必要があります:

from sqlalchemy.orm import aliased

agent = aliased(User, name='agent')
manager = aliased(User, name='manager')
DBSession.query(
        agent.name, manager.name, MyStats.kpi_one, MyStats.kpi_two
    ).filter(
        agent.id == MyStats.agent,
        manager.id == MyStats.manager
    )
于 2012-12-24T22:23:10.430 に答える