python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据

news/2025/1/10 23:33:07/文章来源:https://www.cnblogs.com/io-T-T/p/18664913

04 如何过滤(筛选)数据库中的数据

从数据库中获筛选数据主要应用以下几个接口:filterfilter_by、以及 where。前两个在 02已经展开说过,先展开说where接口

前情提要:依赖03提及的model【本质上就是数据库的链接,有可忽视】

当前的数据库表内容如下,仅作例子,不相同根据自身数据库操作即可:

image-20250110174048807

4-1 通过where进行筛选

  1. 同时筛选多个(或者一个):

    results = session.query(User).where(User.age > 23, User.name == "arthur").all()
    
    • where 接口用法与 filter类型,同样可以接收多个判定条件作为筛选,同理也可以接收单个判定条件,只需要逗号隔开即可
  2. 使用逻辑运算筛选数据

    • 或运算

      可以使用 sqlalchemy.or_ 接口或在where中使用按位或 ”|“ 运算符

      results = session.query(User).where( (User.age > 30) | (User.name == "caster") ).all() #两种或的结果是一致的,根据需要选择即可
      # results = session.query(User).where(
      #     sqlalchemy.or_(
      #     User.age > 30, User.name == 'caster',
      #     )
      # ).all()
      

      PS:为什么在where中,使用python的按位或运算符 能够和使用ORM库的逻辑或输出结果一样呢?他们按位或与逻辑或原理上是不一致的?

      answer:因为在SQLAlchemy中, sqlalchemy.or_()|是等价的,因为SQLAlchemy会自动转换成sqlalchemy.or_();同理后面的逻辑运算符,因此,这两种写法的效果和结果是一致的,都是构建 SQL 查询中的 OR 逻辑。

    • 与运算

      使用的接口换成了 sqlalchemy.and_,以及 &

      def query_and():# results = session.query(User).where(sqlalchemy.and_(#     User.age >= 25, User.name == "caster")# )results = session.query(User).where((User.age >= 25) & (User.name == "caster"))for result in results:print(result)
      

      但好像筛选都是默认就是全为真。

    • 非运算

      def query_by_not():results = session.query(User).where(sqlalchemy.not_(User.name == 'caster'))for result in results:print(result)
      

      就是换了个接口,换成 not_ 了,但需要注意,not_只能接受一个参数,如果多个参数:

      def query_by_not():#错误示范results = session.query(User).where(sqlalchemy.not_(User.name == 'caster', User.age == 21)#参数不能多与1个)for result in results:print(result)
      

      否则输出的结果就是这样了:

      image-20250110181007459

4-2 综合使用where进行筛选

经过上述的知识,已经能掌握逻辑运算筛选了,出个题,读者可以自行尝试,能够达到自己预期的效果则过关了。

  • 题目:筛选名字不为xxx[name1]或 年龄大于xx[age1] 小于xx[age2] [age2>age1]

    这里以名字不为 arthur,或年龄大于22,小于30

  • code:

    def answer():results = session.query(User).where(or_(not_(User.name=='arthur'), (and_(User.age > 22, User.age < 30)))).all()for result in results:print(result)
    

all code:

from model import User, Engine
import sqlalchemy
from sqlalchemy.orm import sessionmaker
from sqlalchemy import or_, and_, not_
Session = sessionmaker(bind=Engine)
session = Session()def search_by_where():# results = session.query(User).where(User.age > 23, User.name == "arthur").all()results = session.query(User).where( (User.age > 30) | (User.name == "caster") | (User.name == "arthur") ).all() #两种或的结果是一致的,根据需要选择即可# results = session.query(User).where(#     sqlalchemy.or_(#     User.age > 30, User.name == 'caster',#     )# ).all()   #可以体会一下两者的不同,判定条件少了一个名字==arthurfor result in results:print(result)def query_and():# results = session.query(User).where(sqlalchemy.and_(#     User.age >= 25, User.name == "caster")# )results = session.query(User).where((User.age >= 25) & (User.name == "caster"))for result in results:print(result)def query_by_not():results = session.query(User).where(sqlalchemy.not_(User.name == 'caster'))for result in results:print(result)def answer():results = session.query(User).where(or_(not_(User.name=='arthur'), (and_(User.age > 22, User.age < 30)))).all()for result in results:print(result)if __name__ == '__main__':# search_by_where()# query_and()# query_by_not()answer()

关于filterfilter_by接口见02 中的增删查改吧,讲的应该还算详细。

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

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

相关文章

[Linux] 包管理器之【APT】

序续:《[Linux] Linux中安装软件的方式? - 博客园/千千寰宇》 《[Linux] 包管理器之综述【RPM/DPKG|YUM/APT】 - 博客园/千千寰宇》概述:包管理器 APTAPT:Advanced Packaging Tool(现名)解释: Advanced Packaging Tool(apt),作为 原始包管理器DPKG的前端包管理工具(…

2024.11.7(spring boot 创建数据库)

然后搭建四层架构 controller,mapper,pojo,service创建mapper的映射文件

2024.11.8(spring boot创建数据库)

三、连接数据库 1.编写文件 在resources包下找到application.properties,将如下代码写入: spring.datasource.username=root spring.datasource.password=admin spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&cha…

2024.11.9(spring boot创建数据库)

pojo层实体类里的属性要与数据表一一对应;查询所有用户是要返回多个User,所以用List; Service层先用@Autowired注入userMapper; 然后声明方法;

django python manage.py报错TimeoutError: [WinError 10060] A connection attempt failed

diango python manage.py报错 TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 加个代理即可

4. gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器

原文地址: gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器 gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器搭建环境: ubuntu: 20.04ros: Noneticsensor: robotiq_ft300gripper: robotiq_2f_140_gripperUR: UR3reasense: D435i 通过下面几篇博…

tomcat9.0下载安装及配置图文教程

下载 官网:http://tomcat.apache.org/ 选择下载64-Bit Windows zip(Win64)2.解压到任意一个盘,如,D:\apache-tomcat-9.0.98 3.设置环境变量 CATALINA_HOME:D:\apache-tomcat-9.0.98 找到系统变量Path,添加:%CATALINA_HOME%\bin验证是否配置成功 进入Windows命令行窗口,…

3. ur3+robotiq ft sensor+robotiq 2f 140+realsense d435i配置rviz,gazebo仿真环境

原文地址: ur3+robotiq ft sensor+robotiq 2f 140+realsense d435i配置rviz,gazebo仿真环境 ur3+robotiq ft sensor+robotiq 2f 140+realsense d435i配置rviz,gazebo仿真环境搭建环境: ubuntu: 20.04ros: Noneticsensor: robotiq_ft300gripper: robotiq_2f_140_gripperUR: U…

01 Java入门

1972年C诞生贴近硬件、运行极快、效率较高 操作系统、编译器、数据库、网络系统等 指针和内存管理1982年C++诞生面向对象 兼容C 图形领域、游戏等1995年Java诞生简单性 面向对象 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性Java三大版本JavaSE:标准版(桌面程序、控制…

2. ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境

原文地址: ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境 ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境搭建环境: ubuntu: 20.04ros: Noneticsensor: robotiq_ft300gripper: robotiq_2f_140_gripperUR: UR3 通过上一篇博客配置好ur3、力传感器和roboti…

Git学习遇到的抽风问题记录

学习git commit和git add的区别的时候,一不小心git commit 没有加“-m”,进入了一个vim配置页面:搞了半天死活出不来,而且担心修改了不该动的东西 解决办法:输入“:”然后输入qa!//放弃任何更改并退出 解决!

咸鱼学习第一天

markdown以及编辑器obsidian的学习 1 创建新笔记Ctrl+n Ctrl+o (可以快速打开需要的笔记;可以加文档名+笔记标题)2 文档属性设置 三个“---”可以添加日期、别名、标签 3 最常用语言一个’-‘加一个空格是一个小圆点 几个“#”+一空格就是几级标题 链接设置①:如我要在…