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

时间:2019-01-26 06:15:40

标签: python orm sqlalchemy

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

我知道如何在原始SQL中执行此操作,但是如何使用SQLAlchemy获得相同的结果?是否可以不使用join

这是我定义的类:


    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

我尝试了以下代码:


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

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

第一行出现错误,第二行没有给我想要的结果,它仅返回一行并且我不知道它是什么:

[('000275510800023', 40685268)]

由于WosDocument对象具有一对多的关系authors,所以我认为我可以查询每个文档的作者编号,而无需显式使用join,但是我不能了解如何使用SQLAlchemy做到这一点。

你能帮我吗?谢谢!

1 个答案:

答案 0 :(得分:1)

如果您在模型中编写了正确的关系。然后查询将像:

db.session.query(ParentTable.pk,func.count('*').label("count")).join(Childtable).group_by(ParentTable).all()

join()的文档的详细信息是 https://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join

如果您没有明确join(),则需要将parent.relations之类的字段作为字段处理。