我使用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/