Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy查询以返回与条件匹配的所有父行和唯一子行_Python_Database_Sqlalchemy_Pyside - Fatal编程技术网

Python SQLAlchemy查询以返回与条件匹配的所有父行和唯一子行

Python SQLAlchemy查询以返回与条件匹配的所有父行和唯一子行,python,database,sqlalchemy,pyside,Python,Database,Sqlalchemy,Pyside,我有这样的一对多关系: class Person(BASE): __tablename__ = 'person' __table_args__ = ({'sqlite_autoincrement': True}) idperson = Column(INTEGER, autoincrement=True, primary_key=True,

我有这样的一对多关系:

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==“charter”。
比如:

重要的一点是,我将此查询提供给Pyside模型
它期望引用从Person开始的属性。所以我不希望基于文档的查询

另外,实际模型在连接中还有两个表,但我认为这对这个问题并不重要

我是SQLAlchemy的新手,所以到目前为止我的尝试都是徒劳的。
这在文档相关列中没有结果

    self.query = (self.datamod.session.query(Person)
                  # .join(Schoolmember)
                  # .join(Student)
                  .outerjoin(Document))
文档以列表的形式存在于查询结果中,但我不能像那样访问它们(用括号[0]),因为模型基本上是在执行getattr来填充Pyside视图。
所以我需要一个大的平面查询。
我试着了解子查询,但到目前为止还不起作用

我想我需要一个返回所有人员的查询,以及filter document.doctag==“charter”为true的第一个文档。
当文档与此人进行一对一时,这种方法可以很好地处理上面的查询,但我无法将其调整为多对一

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

query(Person).all()  


谢谢

什么是儿童类型和日期?在我编辑它之前,您可能已经看到了。childtype变成了doctype,这是一个字符串。date是一个sqlalchemy日期列(SQlite变体,一个日期字符串)。date字段在这里不重要,它可能是任何字段。请发布您的代码尝试。我是新手,所以我的尝试是相当随机的,但我会看看我可以在帖子中添加什么。对。您的解决方案是使用将表连接在一起,并与
Document.childtype==“charter”
一起过滤掉
文档
中不属于
charter“
类型的内容。
query(Person).all()  
    query(Person).outerjoin(Document).filter(Document.doctag=='charter').first()