【python】flask中ORM工具SQLAIchemy,各种数据查询操作详细解析

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,面试宝典等分享。

所属的专栏:flask框架零基础,进阶应用实战教学
景天的主页:景天科技苑

文章目录

  • 基本查询
    • SQLAlchemy常用的查询过滤器
    • get():参数为主键,表示根据主键查询数据,如果主键不存在返回None
    • all()返回查询到的所有对象
    • count() 返回查询结果的数量
    • first()返回查询到的第一个对象
  • filter条件查询
    • 基于filter进行模糊查询
    • 基于filter进行比较查询
    • filter_by精确条件查询
  • 逻辑查询
    • 逻辑与,需要导入`and_`,返回`and_()`条件满足的所有数据
    • 逻辑或,需要导入or_
    • 逻辑非,返回名字不等于"小白"的所有数据
    • not_ 相当于取反
    • in_范围查询
    • is_判断值查询
    • order_by 排序
    • 对查询结果进行偏移量和数量的限制
  • 总结

Hello,大家好,我是景天,前面我们讲到flask的ORM工具的增删改,其实工作中,我们用的较多的还是数据的查询,今天我们就SQLAIchemy的各种查询方式来详细展开!!!

基本查询

SQLAlchemy常用的查询过滤器

filter是模糊查询,filter_by是精确查询
在这里插入图片描述

SQLAlchemy常用的查询结果方法
在这里插入图片描述

get():参数为主键,表示根据主键查询数据,如果主键不存在返回None

查询之前,先看下数据库数据
在这里插入图片描述

@app.route("/get")
def get():"""按主键获取一条,有以下几种查询方式"""# student = Student.query.get({"id": 4})# student = Student.query.get((4,))# student = db.session.query(Student).get(4)student = Student.query.get(4)print(student)return "ok"

浏览器访问/get ,拿到数据
在这里插入图片描述

all()返回查询到的所有对象

# 如果不设置条件,则默认查询全表
student_list = Student.query.all()
print(student_list)# 设置过滤条件查询全部结果
# 如果查不到数据,返回空列表
student_list = Student.query.filter(Student.sex==False).all()
print(student_list)# all()的返回值是一个python列表,可以直接使用切片,与django的QuerySet完全不是一回事。
student_list = Student.query.all()[1:]
print(student_list)

在这里插入图片描述

count() 返回查询结果的数量

# 如果不设置过滤条件,则默认统计全表记录的数量
total = Student.query.count()
print(total)# 设置条件,作为返回满足条件的记录数量
total = Student.query.filter(Student.age>16).count()
print(total)

在这里插入图片描述

first()返回查询到的第一个对象

【first的结果只有一个模型对象】

"""获取查询结果的第一个结果"""
student = Student.query.first()
print(student, student.name)student = Student.query.filter(Student.sex==True).first()
print(student, student.name)"""获取查询结果的第二个结果,现在不支持负索引了"""
student = Student.query.filter(Student.sex==True)[1]
print(student, student.name)

在这里插入图片描述

filter条件查询

支持各种运算符和查询方法或者模糊查询方法。

基于filter进行模糊查询

# 名字包含"黑"的学生
student_list = Student.query.filter(Student.name.contains("黑")).all()
print(student_list)# 名字以"小"开头的学生
student_list = Student.query.filter(Student.name.startswith("小")).all()
print(student_list)# 名字以"红"结尾的学生
student_list = Student.query.filter(Student.name.endswith("兰")).all()
print(student_list)

在这里插入图片描述

基于filter进行比较查询

# 比较查询需要指定条件格式为: filter(模型.字段 比较运算符 值)。
# 运算符可以是: ==表示相等, !=不相等,> 表示大于  < 表示小于,>=大于等于,<=小于等于
# 单个条件的比较查询
student_list = Student.query.filter(Student.age>15).all()
print(student_list)# 多个条件的比较查询
# 要求多个条件都要满足,相当于逻辑查询中的 并且(and)!!
student_list = Student.query.filter(Student.age>15, Student.sex==True).all()
print(student_list)

在这里插入图片描述

filter_by精确条件查询

filter_by 只支持字段的值是否相等的情况,对于大于、小于、大于等于、等等其他条件是不支持的。

例如:返回age等于16的学生

# 单条件格式:filter_by(字段=值)
# 多条件格式:filter_by(字段=值, 字段=值, 字段=值...)
student_list = Student.query.filter_by(age=16).all()  # 字段添加不需要附带模型类
print(student_list)

在这里插入图片描述

逻辑查询

逻辑与,需要导入and_,返回and_()条件满足的所有数据

 # 默认情况下, 多个条件并且的情况,可以直接基于filter或者filter_by采用逗号拼接多个查询条件实现
# 查询年龄大于16的男生
student_list = Student.query.filter(Student.age>16, Student.sex==True).all()
print("第一次",student_list)#  filter(and_(条件1,条件2,....))  等价于  filter(条件1,条件2,.....)
from sqlalchemy import and_
student_list = Student.query.filter(and_(Student.age>16, Student.sex==True)).all()
print("第二次",student_list)

在这里插入图片描述

逻辑或,需要导入or_

# # 查询年龄大于16(Student.age>16)或者钱包余额大于1500(Student.money>1500) 女生
from sqlalchemy import or_
student_list = Student.query.filter(or_(Student.age>16, Student.money>1500), Student.sex==False).all()
print("第一次",student_list)# 查询 年龄大于16的男生(Student.age>16, Student.sex==True) 和 钱包余额大于1500的女生(Student.money>1500, Student.sex==False)
from sqlalchemy import or_, and_
student_list = Student.query.filter(or_(and_(Student.age>16, Student.sex==True),and_(Student.money>1500, Student.sex==False))
).all()
print("第二次",student_list)

在这里插入图片描述

逻辑非,返回名字不等于"小白"的所有数据

#逻辑非
student = Student.query.filter(Student.name != '小白').all()
print(student)

在这里插入图片描述

not_ 相当于取反

from sqlalchemy import not_
student = Student.query.filter(Student.name != '小白').all()
print("第一次",student)student = Student.query.filter(not_(Student.name == '小白')).all()
print("第二次",student)

在这里插入图片描述

in_范围查询

student_list = Student.query.filter(Student.id.in_([1,3,4,5])).all()
print(student_list)

在这里插入图片描述

is_判断值查询

# 查询邮箱为Null的用户
student_list = Student.query.filter(Student.email.is_(None)).all()
print(student_list)"""判断是否存在"""
# 查询是否存在"小辉"这个学生
query = Student.query.filter(Student.name == "小辉").exists()
#通过scalar()拿到查询是否存在
ret = db.session.query(query).scalar()
print("第一次是否存在",ret)student = Student.query.filter(Student.name=="小明").first()
print("第二次是否存在",bool(student))

在这里插入图片描述

order_by 排序

# 按年龄倒叙排序
student_list = Student.query.order_by(Student.age.desc()).all()
print(student_list)# 按钱包余额进行倒序,如果余额一致,按id倒序
student_list = Student.query.order_by(Student.money.desc(), Student.id.desc()).all()
print(student_list)

在这里插入图片描述

对查询结果进行偏移量和数量的限制

#查询年龄最大的三个人
student_list = Student.query.order_by(Student.age.desc()).limit(3).all()
print(student_list)# 查询钱包余额最少的三个人
student_list = Student.query.order_by(Student.money.asc()).limit(3).all()
print(student_list)# 按钱包余额进行倒序排列,查询出排名在4-5之间的学生
student_list = Student.query.order_by(Student.money.desc()).offset(3).limit(2).all()
print(student_list)student_list = Student.query.order_by(Student.money.desc()).all()[3:5]
print(student_list)

在这里插入图片描述

完整代码

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
# 连接数据库连接url
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:Jinghao31357!@10.10.0.52:3306/students?charset=utf8mb4"
# 动态追踪修改设置,如未设置只会提示警告
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
# 查询时会显示原始SQL语句
app.config["SQLALCHEMY_ECHO"] = True# 把SQLAlchemy组件注册到项目中
db = SQLAlchemy()
db.init_app(app)#创建模型类
class Student(db.Model):"""学生信息模型"""# 声明与当前模型绑定的数据表名称__tablename__ = "tb_student2"id = db.Column(db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(15), index=True, comment="姓名")age = db.Column(db.SmallInteger, comment="年龄")sex = db.Column(db.Boolean, default=True, comment="性别")email = db.Column(db.String(128), unique=True, comment="邮箱地址")money = db.Column(db.Numeric(10, 2), default=0.0, comment="钱包")def __repr__(self):  # 相当于django的__str__return f"{self.name}<{self.__class__.__name__}>"class Course(db.Model):"""课程模型"""__tablename__ = "tb_course"id = db.Column(db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(255), unique=True, comment="课程")price = db.Column(db.Numeric(8, 2), comment="价格")def __repr__(self):  # 相当于django的__str__return f"{self.name}<{self.__class__.__name__}>"class Teacher(db.Model):"""老师模型"""__tablename__ = "tb_teacher"id = db.Column(db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(255), unique=True, comment="姓名")#枚举类型option = db.Column(db.Enum("讲师", "助教", "班主任"), default="讲师")def __repr__(self):return f"{self.name}<{self.__class__.__name__}>"@app.route("/get")
def get():"""按主键获取一条,有以下几种查询方式"""# student = Student.query.get({"id": 4})# student = Student.query.get((4,))# student = db.session.query(Student).get(4)# student = Student.query.get(4)# print(student)## # 如果不设置条件,则默认查询全表# student_list = Student.query.all()# print(student_list)## # 设置过滤条件查询全部结果# # 如果查不到数据,返回空列表# student_list = Student.query.filter(Student.sex==False).all()# print(student_list)## # all()的返回值是一个python列表,可以直接使用切片,与django的QuerySet完全不是一回事。# student_list = Student.query.all()[1:]# print(student_list)#count返回查询结果数量# 如果不设置过滤条件,则默认统计全表记录的数量# total = Student.query.count()# print(total)## # 设置条件,作为返回满足条件的记录数量# total = Student.query.filter(Student.age>16).count()# print(total)# """first()获取查询结果的第一个结果"""# student = Student.query.first()# print(student, student.name)## student = Student.query.filter(Student.sex==True).first()# print(student, student.name)## """获取查询结果的第二个结果"""# student = Student.query.filter(Student.sex==True)[1]# # print(student, student.name)# print("查询结果",student)# # 名字包含"黑"的学生# student_list = Student.query.filter(Student.name.contains("黑")).all()# print(student_list)## # 名字以"小"开头的学生# student_list = Student.query.filter(Student.name.startswith("小")).all()# print(student_list)## # 名字以"红"结尾的学生# student_list = Student.query.filter(Student.name.endswith("兰")).all()# print(student_list)# # 比较查询需要指定条件格式为: filter(模型.字段 比较运算符 值)。# # 运算符可以是: ==表示相等, !=不相等,> 表示大于  < 表示小于,>=大于等于,<=小于等于# # 单个条件的比较查询# student_list = Student.query.filter(Student.age>15).all()# print(student_list)## # 多个条件的比较查询# # 要求多个条件都要满足,相当于逻辑查询中的 并且(and)!!# student_list = Student.query.filter(Student.age>15, Student.sex==True).all()# print(student_list)# 单条件格式:filter_by(字段=值)# 多条件格式:filter_by(字段=值, 字段=值, 字段=值...)# student_list = Student.query.filter_by(age=16).all()  # 字段添加不需要附带模型类# print(student_list)## # 默认情况下, 多个条件并且的情况,可以直接基于filter或者filter_by采用逗号拼接多个查询条件实现# # 查询年龄大于16的男生# student_list = Student.query.filter(Student.age>16, Student.sex==True).all()# print("第一次",student_list)## #  filter(and_(条件1,条件2,....))  等价于  filter(条件1,条件2,.....)# from sqlalchemy import and_# student_list = Student.query.filter(and_(Student.age>16, Student.sex==True)).all()# print("第二次",student_list)# # 查询年龄大于16(Student.age>16)或者钱包余额大于1500(Student.money>1500) 女生# from sqlalchemy import or_# student_list = Student.query.filter(or_(Student.age>16, Student.money>1500), Student.sex==False).all()# print("第一次",student_list)## # 查询 年龄大于16的男生(Student.age>16, Student.sex==True) 和 钱包余额大于1500的女生(Student.money>1500, Student.sex==False)# from sqlalchemy import or_, and_# student_list = Student.query.filter(#     or_(#         and_(Student.age>16, Student.sex==True),#         and_(Student.money>1500, Student.sex==False)#     )# ).all()# print("第二次",student_list)# #逻辑非# student = Student.query.filter(Student.name != '小白').all()# print(student)# from sqlalchemy import not_# student = Student.query.filter(Student.name != '小白').all()# print("第一次",student)## student = Student.query.filter(not_(Student.name == '小白')).all()# print("第二次",student)# student_list = Student.query.filter(Student.id.in_([1,3,4,5])).all()# print(student_list)# 查询邮箱为Null的用户# student_list = Student.query.filter(Student.email.is_(None)).all()# print(student_list)## """判断是否存在"""# # 查询是否存在"小辉"这个学生# query = Student.query.filter(Student.name == "小辉").exists()# #通过scalar()拿到查询是否存在# ret = db.session.query(query).scalar()# print("第一次是否存在",ret)## student = Student.query.filter(Student.name=="小明").first()# print("第二次是否存在",bool(student))# # 按年龄倒叙排序# student_list = Student.query.order_by(Student.age.desc()).all()# print(student_list)## # 按钱包余额进行倒序,如果余额一致,按id倒序# student_list = Student.query.order_by(Student.money.desc(), Student.id.desc()).all()# print(student_list)#查询年龄最大的三个人student_list = Student.query.order_by(Student.age.desc()).limit(3).all()print(student_list)# 查询钱包余额最少的三个人student_list = Student.query.order_by(Student.money.asc()).limit(3).all()print(student_list)# 按钱包余额进行倒序排列,查询出排名在4-5之间的学生student_list = Student.query.order_by(Student.money.desc()).offset(3).limit(2).all()print(student_list)student_list = Student.query.order_by(Student.money.desc()).all()[3:5]print(student_list)return "ok"if __name__ == '__main__':#要想执行创建表,需要调用db.creat_all(),db要想被调用,需要放到app上下文里面with app.app_context():# 如果没有提前声明模型中的数据表,则可以采用以下代码生成数据表,# 如果数据库中已经声明了有数据表,则不会继续生成db.create_all()app.run(debug=True)

总结

本文详述了flask的ORM工具SQLAlchemy各种数据查询的详细用法,包含基础查询和各种复杂查询,非常实用,感兴趣的朋友可以一键三连,flask的高阶用法持续更新中!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 密码学实用指南(全)

原文&#xff1a;zh.annas-archive.org/md5/fe5e9f4d664790ea92fb33d78ca9108d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 密码学在保护关键系统和敏感信息方面有着悠久而重要的历史。本书将向您展示如何使用 Python 加密、评估、比较和攻击数据。总的来说&…

Qt对话框

文章目录 创建普通的对话框对话框的内存泄露问题自定义对话框模态式对话框QMessageBox&#xff08;消息对话框&#xff09;对话框类型对话框按钮接收对话框返回值演示其他创建方式 QColorDialog&#xff08;颜色对话框&#xff09;案例 QFileDialog&#xff08;文件对话框&…

仿真测试的应用领域

仿真测试在各种领域中都有广泛的应用&#xff0c;以下是一些应用最广泛的场景&#xff1a; 工业制造&#xff1a;通过模拟制造过程&#xff0c;可以预测产品的质量和性能&#xff0c;优化生产流程&#xff0c;降低成本。航空航天&#xff1a;飞机、导弹、航天器等的设计和研发…

Python - 字符串的应用

字符串格式化问题 使用规则举例: name input("请输入你的名字&#xff1a;") address input("请输入你的住址&#xff1a;") age int(input("请输入你的年龄&#xff1a;")) hobby input("请输入你的爱好&#xff1a;") # %s 字符…

【Android GUI】从总体上了解Android的GUI体系

文章目录 概览Android硬件接口HALGralloc与Framebuffer Gralloc模块的加载Gralloc提供的接口Android原生的Gralloc实现打开framebuffer设备打开gralloc设备 参考 概览 Linux内核提供了统一的framebuffer显示驱动。设备节点/dev/graphics/fb*或者/dev/fb*&#xff0c;其中fb0表示…

快速上手Linux核心命令

Linux 的重要性不用我多说了吧&#xff0c;大多数互联网公司&#xff0c;服务器都是采用的Linux操作系统 Linux是一个主要通过命令行来进行管理的操作系统。 只有熟练掌握Linux核心命令&#xff0c;在使用起来我们才会得心应手 这里给大家整理了Linux一些核心命令&#xff0…

Android --- Activity

官方文档-activity Activity 提供窗口&#xff0c;供应在其中多个界面。此窗口通常会填满屏幕&#xff0c;但也可能小于屏幕并浮动在其他窗口之上。 大多数应用包含多个屏幕&#xff0c;这意味着它们包含多个 Activity。通常&#xff0c;应用中的一个 Activity 会被指定主 Ac…

JAVA基础08- 继承,重写,super以及this

目录 继承&#xff08;extends&#xff09; 定义 说明 作用 方法的重写 定义 重写关键点 方法重写与重载的区别 练习 练习1&#xff08;方法继承与重写的简单练习&#xff09; 练习2&#xff08;方法继承与重写的进阶练习&#xff09; This的使用 定义 作用以及注…

基于SpringBoot+Vue的IT技术交流平台(源码+文档+包运行)

一.系统概述 我国科学技术的不断发展&#xff0c;计算机的应用日渐成熟&#xff0c;其强大的功能给人们留下深刻的印象&#xff0c;它已经应用到了人类社会的各个层次的领域&#xff0c;发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分&#xff0c;使用计算机进行…

leetcode-分割链表

题目 面试题 02.04. 分割链表 提示 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff…

搜维尔科技:【工业仿真】煤矿安全知识基础学习VR系统

产品概述 煤矿安全知识基础学习VR系统 系统内容&#xff1a; 煤矿安全知识基础学习VR系统内容包括&#xff1a;下井流程&#xff08;正确乘坐罐笼、班前会、井下行走注意事项、工作服穿戴、入井检身及人员清点、下井前准备工作、提升运输安全&#xff09;&#xff1b;运煤流程…

SpringBoot集成RockerMQ

1.引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </dependency>2.配置服务器地址 #Rocketmq配置 rocketmq.name-server192…

专业清洁工匠服务网站模板 html网站

目录 一.前言 二.页面展示 三.下载链接 一.前言 该HTML代码生成了一个网页&#xff0c;包括以下内容&#xff1a; 头部信息&#xff1a;指定了网页的基本设置和元数据&#xff0c;例如字符编码、视口大小等。CSS文件&#xff1a;引入了多个CSS文件&#xff0c;用于设置网页…

EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测

EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测 目录 EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实…

动手写sql 《牛客网80道sql》

第1章&#xff1a;SQL编写基础逻辑和常见问题 基础逻辑 SELECT语句: 选择数据表中的列。FROM语句: 指定查询将要从哪个表中检索数据。WHERE语句: 过滤条件&#xff0c;用于提取满足特定条件的记录。GROUP BY语句: 对结果进行分组。HAVING语句: 对分组后的结果进行条件过滤。O…

【STM32】嵌入式实验二 GPIO 实验 (前三个设计)

1&#xff0e; 按键亮灯 设计 GPIO 实验项目 1&#xff0c;功能&#xff1a;当按键 KB1 按下时&#xff0c;实验板上全彩发光二极管周边 的发光二极管全亮&#xff0c;当按键 KB2 按下时跑马灯 D0 闪亮。 实验要求基于寄存器的GPIO配置&#xff0c;所以需要手动操作寄存器来配…

联想小新Air14-2019锐龙版更换硬盘

首先打下D面所有螺丝&#xff08;内六角螺丝&#xff0c;需要准备螺丝刀&#xff09;&#xff0c;然后从下方翘起整个D面打开如下图 原装为2280长度的海力士硬盘&#xff0c;有空余的2242长度硬盘位 更换前断电&#xff0c;建议拆下电池&#xff08;扣下电池排线后不好安装&am…

每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)

目录 力扣279. 完全平方数 问题解析 解析代码 优化代码&#xff08;相同子问题分析和滚动数组&#xff09; 力扣279. 完全平方数 279. 完全平方数 难度 中等 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值…

百科不全书之 docker记录

docker记录 1 参考文件2. Docker简介与虚拟机的区别 1 参考文件 参考视频&#xff1a;B站【GeekHour】30分钟Docker入门教程: link 2. Docker简介 Docker是一个用于构建运行 传送 应用程序的平台。 与虚拟机的区别 虚拟机使用了一种叫做虚拟化的技术。每台虚拟机需要占…

固定测斜仪:工程观测的精密利器

在工程观测测量领域&#xff0c;固定测斜仪扮演着至关重要的角色。固定测斜仪&#xff0c;凭借其耐冲击型倾斜传感器、出色的可靠性、快速稳定的特点&#xff0c;以及简洁的安装和智能识别功能&#xff0c;已成为行业内重要工具。其输出信号为RS485数字量&#xff0c;可直接显示…