在SQLAlchemy中多次查询同一个表

Tei*_*ion 2 python sqlalchemy pyramid

我在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)
Run Code Online (Sandbox Code Playgroud)

MyStats当时存储了代理的经理(因此我们可以根据他们的经理是谁或者根据我们的喜好独立于经理来看他们的绩效如何变化).

我想运行一个查询,我得到以下内容:

Agent  Manager  KPI1   KPI2
Bob    Fred     1      1.1
Alice  Owain    1.2    0.9
Run Code Online (Sandbox Code Playgroud)

等等等等.现在只用代理名称或我可以做的经理名称来提升它:

DBSession.query(User.name, MyStats.kpi_one, MyStats.kpi_two).filter(User.id == MyStats.agent)
Run Code Online (Sandbox Code Playgroud)

我不能做的是同时查询两者.我花了一天的时间来尝试解决这个问题但不能.

Mar*_*ers 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
    )
Run Code Online (Sandbox Code Playgroud)