如何从SQLAlchemy JOIN中的两个表返回结果?

时间:2013-12-03 17:16:03

标签: python sqlalchemy pyramid

我在ORM中定义了两个表:

Base = declarative_base()

class GeneralLedger(Base):
  __tablename__ = 'generalledgers'
  id = Column(Integer, primary_key=True)
  invoiceId = Column(Integer)
  ..

class ConsolidatedLedger(Base):
  __tablename__ = 'consolidatedledgers'
  id = Column(Integer, primary_key = True)
  invoiceId = Column(Integer)

...

我没有在两个表之间设置任何关系。我按如下方式加入:

records = DBSession.query(GeneralLedger).join(ConsolidatedLedger, GeneralLedger.invoiceId == ConsolidatedLedger.invoiceId).all()

我也试过了:

records = DBSession.query(GeneralLedger).filter(GeneralLedger.invoiceId == ConsolidatedLedger.invoiceId).all()

在这两种情况下,当我在视图中显示结果时,只显示GeneralLedger表中的条目。如何从同一结果集中的两个表中获取结果?我试过这个:

records = DBSession.query(GeneralLedger, ConsolidatedLedger).join(ConsolidatedLedger, GeneralLedger.invoiceId == ConsolidatedLedger.invoiceId).all()

但是,出于某种原因,当我在模板(Jinja2)中迭代结果时,每列的列的值都是空的。此外,当计数:

total = DBSession.query(GeneralLedger).join(ConsolidatedLedger, GeneralLedger.invoiceId == ConsolidatedLedger.invoiceId).count()

总行数是两个表中匹配记录的总和。我正在使用webhelpers.paginate来处理分页:

query = DBSession.query(GeneralLedger).join(ConsolidatedLedger, GeneralLedger.invoiceId == ConsolidatedLedger.invoiceId)
records = paginate.Page(query, current_page, url=page_url)

并且发送到模板的结果集就好像删除了ConslidatedLedger表中除了那些之外的所有结果。例如,我的页面总数设置为20条记录。如果该页面上有ConslidatedLedger的记录,该页面将被截断,仅显示来自GeneralLedger的记录,但分页不会中断。

有什么想法?谢谢!

1 个答案:

答案 0 :(得分:13)

records = DBSession.query(GeneralLedger, ConsolidatedLedger).join(ConsolidatedLedger, GeneralLedger.invoiceId == ConsolidatedLedger.invoiceId).all()

应该有效,但我认为在使用记录集时,您需要通过records.GeneralLedgerrecords.ConsolidatedLedger来引用它们:

for record in records:
    print record.GeneralLedger
    print record.ConsolidatedLedger

    print record.GeneralLedger.foo
    # ...etc