flask通过flask-sqlalchemy三表查询通过连接中间表_sqlalchemy 中间表-程序员宅基地

技术标签: 随笔备忘录  

遇到一个问题,文章类型是一个表,文章是一个表,中间表存放了其关系
在这里插入图片描述
逆向分析模型
在这里插入图片描述
这一个实体类模型
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)

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44238683/article/details/107034038

智能推荐

企业数字化转型需要深入研究,不能为了转型而转型_数字化转型 必须调查研究-程序员宅基地

文章浏览阅读272次。此外,也是因为看好数字化的前景,各行各业的企业更是演化出了数字化转型的新时代改革,并在国企、央企公布数字化转型计划后迅速开始了在数字化转型上的规划,开始走上了革新的道路。不过虽然数字化转型在商业世界中热火朝天的开始落地应用,但实际上数字化转型目前还并没有真正得到大多数人认可的方法论,只有一个大体上的共识,那就是数字化转型不是简单的数字化建设或者数字化管理,而是通过数字化相关的技术,以数据为基础,以用户为中心,对整个企业进行一场颠覆性的改革,创造一种新的商业模式或是对企业已有的商业模式进行重塑。......_数字化转型 必须调查研究

miRWalk:综合型的miRNA靶基因数据库-程序员宅基地

文章浏览阅读416次。欢迎关注”生信修炼手册”!miRWalk是一个综合性的miRNA靶基因数据库,收录了人,小鼠等多个物种的miRNA靶基因信息,和mirDIP类似,也是一个整合型数据库,整合了来自miRD..._mirwalk数据库

aapt 命令 获取APK应用包名 权限 等信息_aapt dump xmltree cleanmaster.apk androidmanifest.-程序员宅基地

文章浏览阅读1.4k次。aapt 权限 包名 apk_aapt dump xmltree cleanmaster.apk androidmanifest.xml > androidmanifest7.xml

学习 Python 数学模块之 为什么我们需要使用数学模块_数学模块是什么意思-程序员宅基地

文章浏览阅读1.4k次。学习 Python 数学模块在本教程中,我将向您展示如何使用内置的 Pythonmath模块。什么是数学模块?它是 C 标准定义的数学模块。数学模块提供对数学函数的访问。我知道我在上面的陈述中使用了一些行话。让我清理一下混乱。上述陈述中的重要术语是模块、C 标准、数学函数。模块:包含一组语句 和定义 的文件称为模块。例如,该文件program.py称为模块,模块名称为program. 您将在后面的教程中了解如何使用模块。C标准:我们也叫它libc(意思是库C),是C编程语言的标准库。C 标准库_数学模块是什么意思

【肌电信号EMG】表面肌电信号肌肉疲劳状态检测(时域频域分析 熵值分析)【含Matlab源码 4307期】-程序员宅基地

文章浏览阅读704次,点赞10次,收藏30次。表面肌电信号肌肉疲劳状态检测(时域频域分析 熵值分析)完整的代码,包运行;运行操作视频见CSDN资源!适合小白!

通过一个实例理解“父相子绝”(CSS重难点,附完整代码)_父相子绝代码-程序员宅基地

文章浏览阅读1k次。本文笔记基于「千古壹号」的GitHub项目:https://github.com/qianguyihao/web效果图:代码:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="widt..._父相子绝代码

随便推点

嵌入(embedding)概念_嵌入模型embedding-程序员宅基地

文章浏览阅读1.4k次,点赞36次,收藏26次。嵌入(embedding)技术在数学、机器学习和数据科学中扮演着关键角色,其核心目标是将复杂或高维的数据结构转换为低维的向量表示,以便于理解和处理。通过嵌入过程,原本难以直接操作和分析的对象可以被映射到一个具有特定结构的空间模型中,这个空间中的元素间关系更清晰,运算规则也更为明确。_嵌入模型embedding

中南林业科技大学c语言考研真题,2018年中南林业科技大学计算机与信息工程院802C语言与数据结构之C程序设计考研核心题库...-程序员宅基地

文章浏览阅读616次。一、选择题1. 若有定义语句:则以下语句中正确的是( )。A.B.C. D.【答案】A【解析】声明了 a 是一个二维数组,p 是长度为3的针,可以指向二维数组中的元素。B 项错误,维数组的地址。2. 有以下程序段若要求使p 指向一个int 型的动态存储单元,在横线处应填入的是( )。A.intB. (int*)C.int*D. (*int)【答案】BC 语言标准规定malloc ..._中南林业科技大学《c语言程序设计》考研真题

vasp 安装_安装Atomic Simulation Environment (ASE)-程序员宅基地

文章浏览阅读1.7k次。ASE用Python面向对象编写的程序接口,内置了过渡态搜索、声子谱等功能,可以外接CP2K、VASP、Gaussian等软件进行能量计算。官网对它的设计目标有着如下介绍:· Easy to use:Setting up an atomistic total energy calculation or molecular dynamics simulation with ASE is simple..._ase vasp

Android源码50例汇总,欢迎各位下载_android最新源码汇总-程序员宅基地

文章浏览阅读560次。下载中心好资料很多,藏在各个角落,小弟在此帮大家做了一个整理,做了一个下载目录,方便大家选择性下载。源码实例如下:《Android应用开发揭秘》源代码推荐http://down.51cto.com/data/102497Android Phone驱动http://down.51cto.com/data/246537安卓(android)编程入门开发教程笔记_android最新源码汇总

Protel99SE中pcb载入网络表所有元件重叠在一起的问题_pcb导入元器件重叠在一起-程序员宅基地

文章浏览阅读504次。针对答案一,我在某文库中找了一些相关授课ppt,发现有的老师教学载入后是按元件类型成列排布的;有的老师则和我的情况一样,是堆叠在一起然后通过Auto place功能一步步展开。查阅了下相关的版本信息,发现Altium Designer就是Protel99se的升级版。问题出现在旧版本Protel99SE sp2上,载入网络表所有元器件都会重叠在一起。所以针对答案二分析答案一,有没有可能是软件版本太低导致没有所需的功能。但是在课上机房内使用时,载入后是按类成列排版的。于是下载升级补丁厚,成功解决问题。_pcb导入元器件重叠在一起

k8s 学习 kubeadm join 超时报错 : error uploading crisocket: timed out waiting for the condition-程序员宅基地

文章浏览阅读4.4k次。因为改了master 名字,集群起不来,后来删除所有节点,重新部署,删除配置文件,rm /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/pki/ca.crt -f关闭kubelet服务,节点加入集群时报错,error execution phase kubelet-start: error uploading crisocket: timed out waiting for the c_error uploading crisocket