SQLAlchemy查询返回所有父项和仅与条件匹配的子行

时间:2016-03-17 04:02:58

标签: python database sqlalchemy pyside

我有这样一对多的关系:

class Person(BASE):

    __tablename__ = 'person'
    __table_args__ = ({'sqlite_autoincrement': True})

    idperson = Column(INTEGER,
                      autoincrement=True,
                      primary_key=True,
                      nullable=False)

    lastname = Column(VARCHAR(45), index=True, nullable=False)
    firstname = Column(VARCHAR(45), index=True, nullable=False)
    persontype = Column(VARCHAR(20), default='ORPHANED', nullable=False)


class Document(Base):
    __tablename__ = 'document'
    __table_args__ = ({'sqlite_autoincrement': True})

    iddocument = Column(INTEGER,
                        autoincrement=True,
                        primary_key=True,
                        nullable=False)  
    person_id = Column(INTEGER, ForeignKey("person.idperson"),
                       index=True,
                       nullable=False)  

    doctag = Column(Varchar(20),
                     autoincrement=True,
                     primary_key=True,
                     nullable=False nullable=False, default='Misc')  

    datesigned = Column(Date)  

    person = relationship("Person", foreign_keys=[person_id],
                          backref=backref("document", uselist=True,
                          cascade="all, delete-orphan"))  

什么是将返回每行一个人的平面列表(适用于网格)的查询 doctag和datesigned为空,除非doctag == && 39; charter' 喜欢:

Smith | Harry |         |        |  
Brown | James | charter | 2/2/16 |

这一点很重要的一点是我将此查询提供给Pyside模型 期望引用从Person开始的属性。所以我不想要基于Document的查询。

此外,实际模型在联接中还有两个表,但我不认为这对这个问题很重要。

我是SQLAlchemy的新手,所以到目前为止我的尝试都被火爆了。
这与文档相关的列没有结果。

    self.query = (self.datamod.session.query(Person)
                  # .join(Schoolmember)
                  # .join(Student)
                  .outerjoin(Document))

文档在查询结果中作为列表存在,但我无法像那样访问它们(带括号[0]' s),因为模型基本上是用getattr来填充Pyside视图。登记/> 所以我需要一个大的扁平查询 我试图绕过子查询,但到目前为止它还没有工作。

我认为我需要一个返回所有人员的查询,以及第一个文档,其中过滤器Document.doctag ==' charter'是的 当文档与Person一对一时,这曾经与上面的查询一起正常工作,但我还没有能够适应多对一。

换句话说,我可以合并这两个查询的结果:

query(Person).all()  

    query(Person).outerjoin(Document).filter(Document.doctag=='charter').first()

由于

0 个答案:

没有答案