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

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

时间:2025-01-10 23:32:59浏览次数:1  
标签:SQLAlchemy name 04 python results session User query where

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()   #可以体会一下两者的不同,判定条件少了一个名字==arthur
    for 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 中的增删查改吧,讲的应该还算详细。

标签:SQLAlchemy,name,04,python,results,session,User,query,where
From: https://www.cnblogs.com/io-T-T/p/18664913

相关文章

  • 【AI中数学-线代-综合实例-包括python实现】揭秘数据:主成分分析的特征探险
    第三章线性代数--综合实例第4节揭秘数据:主成分分析的特征探险主成分分析(PCA,PrincipalComponentAnalysis)是一种常用的数据降维技术,通过将高维数据投影到低维空间,保留数据中的主要特征和变异性。PCA不仅能够帮助我们理解数据结构,还能提升机器学习算法的效率和性能。本节......
  • 《CPython Internals》阅读笔记:p76-p95
    《CPythonInternals》学习第5天,p76-p95总结,总计20页。一、技术总结无。二、英语总结(生词:1)1.checkvi/vt.toexamsthtoensureitiscorrect,true,oringoodcondition.示例:(1)AfterI'dfinishedthetest,Icheckedmyanswersformistakes.这种用法比......
  • 高级语言(Java\Python\Php)的编译:链接及装载过程介绍10
    引言随着越来越多功能强大的高级语言的出现,在服务器计算能力不是瓶颈的条件下,很多同学会选择开发效率高,功能强大的虚拟机支持的高级语言(Java),或者脚本语言(Python,Php)作为实现功能的首选,而不会选择开发效率低,而运行效率高的C/C++作为开发语言。而这些语言一般情况下是运行在虚......
  • 高级语言(Java\Python\Php)的编译:链接及装载过程介绍2
    引言随着越来越多功能强大的高级语言的出现,在服务器计算能力不是瓶颈的条件下,很多同学会选择开发效率高,功能强大的虚拟机支持的高级语言(Java),或者脚本语言(Python,Php)作为实现功能的首选,而不会选择开发效率低,而运行效率高的C/C++作为开发语言。而这些语言一般情况下是运行在虚......
  • 【Python】Python与C的区别
    文章目录语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数语句结束符C语言C语言中每条语句必须以分号;结束。例如,inta=10;、printf("Hello,World!");。分号是语句的一部分,用于告诉编译器一条语句在哪里结束。如果忘记添......
  • Python基础课笔记
    文章目录第二节——Python基础课陈述句整型字符串列表字典(哈希表)判断缩进判断空值循环for循环:foriin范围字典中循环while循环列表切片删除插入循环后置函数加减乘除定义函数类(类比JAVA)定义实例化继承(类比JAVA)矩阵numpy定义合并切片正常切跳着切张量Tensor定义......
  • 第 4 课 Python 条件语句
    1.条件语句介绍        条件语句,即通过判断条件是否成立,根据条件表达式的结果,控制不同代码块的执行。1.1条件表达式    条件表达式由运算符和操作数组成,以“a<4”为例,其中,“a”和“4”都为操作数,“<”为运算符。        判断条件可以是具有布尔......
  • Python应用指南:高德交通态势数据(二)
    本篇文章是对上篇内容的一个深化探讨,通过生成多个矩形来实现一定范围的道路交通态势查询,在上一篇文章中,我们详细介绍了如何利用单个矩形区域查询功能来获取特定区域内的实时交通状况。然而,在实际应用中,城市交通网络复杂多变,单一矩形往往难以覆盖大面积的地理范围或满足更精细......
  • 基于python的网页表格数据下载--转excel
    基于Python的网页表格数据爬取与下载:以维基百科为例目录基于Python的网页表格数据爬取与下载:以维基百科为例1.背景介绍2.工具与环境3.操作步骤1.获取网页内容2.定位表格元素3.表格变身PandasDataFrame4.检查数据,收工!5.进阶玩法与优化6.完......
  • CSV库写数据 生成Excel表格数据 Python
    一维数据1.代码importcsvlist1=["name","age","school","address"]filew=open('asheet.csv',"w")filew.write(",".join(list1))filew.close()filew=open('asheet.csv','r')lin......