SQLAlchemy 如何对一对多关系进行 COUNT 计数?

2019-01-26 15:26:55 +08:00
 tomleung1996

问题描述

我用 SQLAlchemy 建了一个 SQLite 数据库来存文献数据,现在我想查每一篇文献的作者数量,作者和文献是分开两张表存的,用文献的识别号来建立联系

我知道用 SQL 怎么查询,但是现在我想用 SQLAlchemy 来操作,不使用纯 SQL

文献和作者对象的定义代码如下:

    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)

我希望查询得到的结果和这个 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

但是用了 ORM 之后我可以通过WosDocument.authors来获得一篇文章的全部作者信息,于是我就想是不是能够不使用join也能达到同样的效果?于是我尝试了下面的代码:

    session.query(WosDocument.unique_id, len(WosDocument.authors)).all()

    session.query(WosDocument.unique_id, func.count(WosDocument.authors)).all()

第一种方式直接就报错无法执行,第二种方式只返回了一行结果,我也理解不了结果的含义是什么

[('000275510800023', 40685268)]

我想问用 SQLAlchemy 的正确写法是什么?可以不使用连接查询吗?谢谢大家!

1208 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/530844

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX