flask通过flask-sqlalchemy三表查询通过连接中间表

本文介绍了一种使用SQL和ORM技术查询每种文章类型下文章数量的方法,通过两个不同的实现方案,展示了如何利用Python的Flask框架和SQLAlchemy ORM进行数据查询和处理,适用于需要统计分类数据的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到一个问题,文章类型是一个表,文章是一个表,中间表存放了其关系
在这里插入图片描述
逆向分析模型
在这里插入图片描述
这一个实体类模型
models.py

from main import db


class Base(db.Model):
    """基类"""
    # 作为父类被继承,不会被创建成表(抽象)
    __abstract__ = True
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)

    def save(self):
        db.session.add(self)
        db.session.commit()

    def delete(self):
        db.session.delete(self)
        db.session.commit()

    def update(self):
        db.session.commit()

class Type(Base):
    __tablename__ = "type"
    name = db.Column(db.String(32),nullable=True) # 类型名
    description = db.Column(db.Text,nullable=True) # 描述

class Article(Base):
    __tablename__ = "article"
    title = db.Column(db.String(32),nullable=True) # 标题
    date = db.Column(db.DateTime,nullable=True) # 发表时间
    content = db.Column(db.Text,nullable=True) # 内容
    description = db.Column(db.Text,nullable=True) # 描述
    author_id  = db.Column(db.Integer,db.ForeignKey("author.id"),nullable=True) # 所属作者id
    types = db.relationship("Type", secondary="article_type", backref="articles")

class Author(Base):
    __tablename__ = "author"
    name = db.Column(db.String(32), nullable=True)  # 作者
    gender = db.Column(db.String(32), nullable=True)  # 性别
    age  = db.Column(db.Integer,nullable=True) # 年龄
    email = db.Column(db.String(254),nullable=True)
    articles = db.relationship("Article",backref="author")

# 创建中间表
article_type = db.Table(
    "article_type", # 中间表名称
    db.Column("id",db.Integer,primary_key=True,autoincrement=True), # 主键
    db.Column("article_id",db.Integer,db.ForeignKey("article.id")), # 属性 外键
    db.Column("type_id",db.Integer,db.ForeignKey("type.id")), # 属性 外键
)


下图为两表数据内容
在这里插入图片描述
查询每中文章类型,有多少篇文章
方案一:

@userbl.route("/select/type/number/")
def select_type_number():
    """查找文章类型和类型下书的数量"""
    type_count = db.session.query(Type.name,func.count(article_type)).group_by(Type.name).all()
    article_type_list = Type.query.all()
    result = []
    for article_type1 in article_type_list:
        ret = len(article_type1.articles)
        result.append({"type_name": article_type1.name, "count": ret})
    return "文章类型和类型下书的数量:{}".format(result)

方案二:

@userbl.route("/select/type/number/")
def select_type_number():
    """查找文章类型和类型下书的数量"""

    result = Article.query.join(article_type).join(Type).group_by(Type.name).with_entities(Type.name,func.count(Article.id)).all()
    return "文章类型和类型下书的数量:{}".format(result)

结果一致
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值