Python sql炼金术中的连接和计数

Python sql炼金术中的连接和计数,python,sqlalchemy,Python,Sqlalchemy,我有一个这样定义的模型: class Article(db.Model): id = db.Column(db.Integer, primary_key=True) authors = db.relationship('Author', secondary=articles_authors, backref=db.backref('articles', lazy='dynamic')) tags = db.relationship('Tag', secondary=art

我有一个这样定义的模型:

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    authors = db.relationship('Author', secondary=articles_authors, backref=db.backref('articles', lazy='dynamic'))
    tags = db.relationship('Tag', secondary=articles_tags, backref=db.backref('articles', lazy='dynamic'))
    comments = db.relationship('Comment', backref=db.backref('article'), lazy='dynamic')
    creation_time = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    modification_time = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    title = db.Column(db.String(256), nullable=False)
    contents = db.Column(db.Text, nullable=False)
我想创建一个查询,该查询将为我提供所有与作者和标记关联的文章,并统计与给定文章相关的评论。这就是我到目前为止发现的:

Article.query.options(db.joinedload(Article.authors), db.joinedload(Article.tags)).all()
给我带来麻烦的是计数部分——我找不到任何关于如何做的例子。那我该怎么做呢

编辑:

不起作用但感觉方向正确的查询:

subquery = db.session.query(Comment.article_id, func.count(Comment.id).label('comments_count'))\
            .group_by(Comment.article_id).subquery()

return db.session.query(Article, subquery.c.comments_count)\
    .outerjoin(subquery, Article.id == subquery.c.article_id)\
    .join(Tag).all()
本例中的计数部分工作正常,但我不会使用此查询获取标记和作者

编辑2:

如果不明显-物品和标签之间的关系是多对多的:

articles_tags = db.Table('articles_tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('article_id', db.Integer, db.ForeignKey('article.id'))
)
文章和作者也是如此

编辑:

答案是:

subquery = db.session.query(Comment.article_id, func.count(Comment.id).label('comments_count'))\
            .group_by(Comment.article_id).subquery()

return db.session.query(Article, subquery.c.comments_count)\
    .outerjoin(subquery, Article.id == subquery.c.article_id)\
    .options(db.joinedload(Article.authors), db.joinedload(Article.tags)).all()

我想你要找的可能是这样的(?)

要获取作者和标记,您应该能够在
文章
对象上使用
.authors
.tags
。要急切地加载它,可以使用joinedload或subqueryload

编辑:

(
    session.query(Article, func.count(Comment.id))
    .select_from(Comment)
    .join(Comment.article)
    .options(db.joinedload(Article.authors), db.joinedload(Article.tags))
    .group_by(Article)
)

为什么要使用
joinedload
而不是
join
?你到底想算什么?关于
joinedload
vs
join
-不知道男人:)。我刚开始学习flask+Sql炼金术,我发现它非常混乱。我想找出关于文章的信息-谁写了给定的文章,给它分配了什么标签,文章有多少评论。你能看看我更新的问题吗?你能尝试使用我的查询在返回的
文章
对象上使用
.authors
.tags
?其中每一个都必须是内部的子查询,因为它不是一个平面结构,因为它是多对多的。虽然你的答案对我来说并不完全正确,但它把我推到了一个好的轨道上,所以我接受它。谢谢第二个查询对您有用吗?除非出现错误,否则查询id然后再次查询对象似乎是多余的。第二个查询不起作用-列“article.id”必须出现在GROUPBY子句中。。。
(
    session.query(Article, func.count(Comment.id))
    .select_from(Comment)
    .join(Comment.article)
    .options(db.joinedload(Article.authors), db.joinedload(Article.tags))
    .group_by(Article)
)