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()