我在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的记录,但分页不会中断。
有什么想法?谢谢!
答案 0 :(得分:13)
records = DBSession.query(GeneralLedger, ConsolidatedLedger).join(ConsolidatedLedger, GeneralLedger.invoiceId == ConsolidatedLedger.invoiceId).all()
应该有效,但我认为在使用记录集时,您需要通过records.GeneralLedger
和records.ConsolidatedLedger
来引用它们:
for record in records:
print record.GeneralLedger
print record.ConsolidatedLedger
print record.GeneralLedger.foo
# ...etc