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

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

这是我定义的类:


    WosDocument(Base)类:
        __tablename__ ='wos_document'

        document_id = Column(整数,primary_key = True)
        unique_id = Column(字符串,唯一= True)
        ......
        作者=关系('WosAuthor',back_populates ='document')

    WosAuthor(Base)类:
        __tablename__ ='wos_author'

        author_id = Column(整数,primary_key = True,autoincrement = True)

        document_unique_id =列(字符串,ForeignKey('wos_document.unique_id'))
        document = Relationship('WosDocument',back_populates ='authors')

        last_name =列(字符串)
        first_name =列(字符串)



我的目标是获得与此SQL查询相同的结果:


     选择一个a.unique_id,COUNT(*)
     从wos_document作为
     左加入wos_author AS b
     开启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做到这一点。

你能帮助我吗?谢谢!

最佳答案

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

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的内容作为字段处理。

关于python - 如何使用SQLAlchemy计算有或没有连接到父表的子表项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54376147/

10-12 01:31