Python中Flask-SQLAlchemy的group_by用法问题请教

各位大神,菜鸟一枚 我有一个文章表 模型是

class Post(db.Model):
    __tablename__ = 'post'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(32), unique=True)
body = db.Column(db.Text)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))

有一个分类表 模型是

class Category(db.Model):
    __tablename__ = 'category'
id = db.Column(db.Integer, primary_key=True)
posts = db.relationship('Post', backref='postcategory', lazy='dynamic')
categoryName = db.Column(db.String(32), unique=True, index=True)

我想查出category 文章分类每个分类有多少篇文章

我有 sql 能查,语句是

SELECT COUNT(id),(SELECT categoryName from category WHERE post.category_id=category.id) as N FROM post GROUP BY category_id

请教一下各位大神,如果用 flask-sqlalchemy 怎么写呀 谢谢各位了


Python中Flask-SQLAlchemy的group_by用法问题请教

6 回复

Flask-SQLAlchemy的group_by用法和原生SQLAlchemy基本一致,主要用在查询时对结果进行分组。常见问题通常出在分组后选择字段上。下面给几个典型场景的代码示例。

场景1:简单计数分组 比如按用户类别统计数量:

from models import User
from sqlalchemy import func

result = db.session.query(
    User.category, 
    func.count(User.id).label('count')
).group_by(User.category).all()

# 返回格式:[('category1', 5), ('category2', 3)]

场景2:分组后聚合计算 按日期分组计算平均值:

from models import Order
from sqlalchemy import func, Date

result = db.session.query(
    func.date(Order.created_at).label('date'),
    func.avg(Order.amount).label('avg_amount')
).group_by(func.date(Order.created_at)).all()

场景3:多字段分组 按部门和职位统计:

result = db.session.query(
    Employee.department,
    Employee.position,
    func.count(Employee.id)
).group_by(Employee.department, Employee.position).all()

关键点:

  • 使用func.count()func.sum()等聚合函数
  • group_by()中的字段必须是查询的字段(除非使用MySQL的宽松模式)
  • 可以用label()给聚合结果起别名方便访问

常见错误处理: 如果遇到"SELECT list is not in GROUP BY clause"错误,要么把所有非聚合字段都加到group_by()中,要么使用聚合函数处理这些字段。

总结:按需选择分组字段,配合聚合函数使用。

可以试试这个:

python<br>from sqlalchemy import func<br> db.session.query(func.count(<a target="_blank" href="http://Post.id" rel="nofollow noopener">Post.id</a>), Category.categoryName).select_from(Category).\<br> join(Post, <a target="_blank" href="http://Category.id" rel="nofollow noopener">Category.id</a> == Post.category_id).group_by(Post.category_id).all()<br>

谢谢您,我等下回家测试一下,谢谢您帮助我

谢谢您,,。。原来我查资料,关键字全是 flask-sqlalchemy .原来用 sqlalchemy 就可以完成。谢谢您

解决了就好,不客气

回到顶部