2012-12-24 45 views
2

我在Pyramid應用程序中使用了SQLAlchemy,並且有以下一對錶。在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) 

我不能做的是同時查詢兩者。我花了我一天中更多的時間努力工作,但不能。

回答

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 
    )