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

标签 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 来做到这一点。

你能帮我吗?谢谢!

最佳答案

如果您在模型中编写了正确的关系。那么查询将是这样的:

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/

相关文章:

python - 谷歌 Colab 运行时错误 : cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

python - 如何找到在线性时间和常数空间中出现超过 N/3 次的值

python - py2exe 与应用程序的不同部分

java - 具有相同类的父子的 JPA 映射

python - 什么是 python 'in' 但对于 sqlalchemy

Python 脚本没有输出

java - Hibernate/HQL - 如何获取从数据库返回的所有重复项?

php - Doctrine 2 的判别器问题

python - "Dependency rule tried to blank-out primary key column"可能是什么原因

sqlalchemy - 手动更改 Alembic 的 HEAD 位置