Python 如何使用SQLAlchemy计算有或没有连接到父表的子表项?

Python 如何使用SQLAlchemy计算有或没有连接到父表的子表项?,python,orm,sqlalchemy,Python,Orm,Sqlalchemy,我使用SQLAlchemy创建了一个SQLite数据库,其中存储了一些文档的书目数据,我想查询每个文档的作者编号 我知道如何在原始SQL中实现这一点,但是如何使用SQLAlchemy实现相同的结果呢?可以不使用连接 以下是我定义的类: class WosDocument(Base): __tablename__ = 'wos_document' document_id = Column(Integer, primary_key=True) uni

我使用SQLAlchemy创建了一个SQLite数据库,其中存储了一些文档的书目数据,我想查询每个文档的作者编号

我知道如何在原始SQL中实现这一点,但是如何使用SQLAlchemy实现相同的结果呢?可以不使用
连接

以下是我定义的类:

class WosDocument(Base): __tablename__ = 'wos_document' document_id = Column(Integer, primary_key=True) unique_id = Column(String, unique=True) ...... authors = relationship('WosAuthor', back_populates='document') class WosAuthor(Base): __tablename__ = 'wos_author' author_id = Column(Integer, primary_key=True, autoincrement=True) document_unique_id = Column(String, ForeignKey('wos_document.unique_id')) document = relationship('WosDocument', back_populates='authors') last_name = Column(String) first_name = Column(String) WOS类文档(基本): __tablename_uuu='wos_文档' 文档id=列(整数,主键=True) unique_id=Column(字符串,unique=True) ...... authors=关系('wosautor',back_populates='document') 沃索托级(基础): __tablename_uuu='wos_author' author\u id=Column(整数,主键=True,自动递增=True) document\u unique\u id=列(字符串,ForeignKey('wos\u document.unique\u id')) 文档=关系('WosDocument',back_populates='authors') 姓氏=列(字符串) 第一个名称=列(字符串) 我的目标是获得与此SQL查询相同的结果:

SELECT a.unique_id, COUNT(*) FROM wos_document AS a LEFT JOIN wos_author AS b ON a.unique_id = b.document_unique_id GROUP BY a.unique_id 选择一个唯一的\u id,计数(*) 从wos_文件作为 左加入wos_作者为b 在a.unique\u id=b.document\u unique\u id上 按a.unique\u id分组 我尝试了以下代码:

session.query(WosDocument.unique_id, len(WosDocument.authors)).all() session.query(WosDocument.unique_id, func.count(WosDocument.authors)).all() session.query(WosDocument.unique_id,len(WosDocument.authors)).all() session.query(WosDocument.unique_id,funct.count(WosDocument.authors)).all() 第一行出现错误,第二行没有给出所需的结果,它只返回一行,我不知道它是什么:

[('000275510800023', 40685268)] [('000275510800023', 40685268)] 由于
WosDocument
对象具有一对多的关系
authors
,我认为我可以查询每个文档的作者编号,而无需显式使用
join
,但我无法找到如何使用SQLAlchemy实现这一点


你能帮我吗?谢谢

如果您在模型中编写了正确的关系。那么查询将如下所示:

db.session.query(ParentTable.pk,func.count('*').label("count")).join(Childtable).group_by(ParentTable).all()
join()
文档的详细信息如下


如果不明确地将
join()
作为字段处理类似于
parent.relations
的内容。

我认为这种关系是错误的,请尝试类似的方法
document=db.relationship('Wos',primaryjoin='WosAuther.document\u unique\u id==WosDocument.document\u id',backref='authers')
您可以查询文档,它会有一个包含许多内容的列表wosauther@ShiheZhang谢谢我可以通过
wosdocument.authors
和我的关系查询单个文档的作者,但我不知道如何查询每个文档的作者数。那么
len(wosdocument.authors)
呢?
选择一个唯一的\u id,count(*)从wos_文档作为左连接wos_作者作为b在a.unique_id=b.document_unique_id组中按a.unique_id
此查询结果令我困惑。如果某些文档没有作者,计数(*)仍将有1。你确定这是你想要的吗?@ShiheZhang每个文档必须至少有一个作者,即使有时作者是匿名的(我已经检查过了)。如果我将len(wosdocument.authors)放入session.query(),它将引发一个错误。但是如果我已经获取了文档对象,那么
len()
函数可以正常工作。现在我更清楚如何在SQLAlchemy中使用
join
,谢谢!我认为SQLAlchemy足够聪明,可以将
parent.relations
视为一个“虚拟字段”,因为我可以使用
parent.relations
在获得父对象后获得其子对象。但似乎我错了。使用
join()
是一种更好的做法,对吗?它巧妙地将关系视为“虚拟场”。但是,您需要指定所需的结果,或者需要处理“虚拟字段”。我明白了。我启用了
echo
功能,并看到
join()
函数已被转换为SQL中的
join
,如何执行
LEFT join
?SQLAlchemy似乎没有它。检查我在答案中提供的链接,如果我执行
session.query(WosDocument.authors).all(),默认连接是
LEFT join
,翻译后的SQL是
选择wos\u document.unique\u author.document\u unique\u id作为wos\u document中的作者,wos\u author
。一旦执行,几GB的数据正在写入我的磁盘,为什么会发生这种情况?