我在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)
我不能做的是同时查询两者。我花了大部分时间试图解决这个问题,但不能。
答案 0 :(得分:7)
您需要创建aliased tables:
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
)