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

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

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

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

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

image-20250110174048807

4-1 通过where进行筛选

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

    ```python
    

    results = session.query(User).where(User.age > 23, User.name == "arthur").all()
    ```

    • where 接口用法与 filter类型,同样可以接收多个判定条件 作为筛选,同理也可以接收单个判定条件,只需要逗号隔开即可
    • 使用逻辑运算 筛选数据

    • 或运算

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

            ```python
    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_,以及 &

            ```python
    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)
    ```

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

 * 非运算

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

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

            ```python
    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:
    ```python
    

    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:

```python
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 中的增删查改吧,讲的应该还算详细。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/6515.html

(0)
LomuLomu
上一篇 2025 年 1 月 15 日 下午6:15
下一篇 2025 年 1 月 15 日 下午7:16

相关推荐

  • o3 发布了,摔碎了码农的饭碗

    大家好,我是汤师爷~ 在 2024 年底,OpenAI 发布了最新推理模型 o3。o3模型相当炸裂,在世界级编程比赛中拿下第 175 名,打败 99.9% 的参赛者。AI 写代码都赶上顶级程序员了,程序员是不是要失业? 最近不少读者反馈,像 GitHub Copilot、Claude Sonnet 3.5、Cursor 等 AI 辅助编程工具,能让代码编写效…

    2025 年 1 月 12 日
    31500
  • Markdown学习

    Markdown学习 (使用软件Typora) 标题 “#”个数加空格,最多支持到六级标题,其中一级标题是最大的 字体 粗体,两边都加**,然后空格 例如粗体 斜体,两边都加*,然后空格 例如 斜体 (思考?斜体加粗怎么实现呢?——三个星号然后空格就行,例如 斜体加粗 ) 删除线,两边都加~~,然后空格 例如~~删除线~~ 引用 一个>加上一个空格,效果如下…

    2025 年 1 月 13 日
    19900
  • DEA永久破解教程(2024IDEA永久激活码)

    IntelliJ IDEA,一款领先的Java编程语言集成开发环境,广泛认为是顶尖的Java工具之一。本文将介绍如何使用脚本来免费激活IDEA及Jetbrains系列工具,适用于2021及之后的版本,包括最新版。 一、IDEA的安装 访问JetBrains官方网站下载IDEA的最新版。安装过程直观,按照屏幕上的步骤完成安装。 二、激活工具的下载 Window…

    未分类 2024 年 7 月 10 日
    1.2K00
  • Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等

    目录 前言 集合类 ArrayList 1. 创建和初始化 ArrayList 2.添加元素 add 3.获取元素 get 4.删除元素 remove 5.检查元素 6.遍历 ArrayList LinkedList Stack 1. 创建Stack对象 2. 压入元素 (push) 3. 弹出元素 (pop) 4. 查看栈顶元素 (peek) 5. 检查栈…

    2025 年 1 月 5 日
    23900
  • 《重构:改善既有代码的设计(第2版)》PDF、EPUB免费下载

    电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍 点击原文去下载 书籍信息 作者: [美] Martin Fowler出版社: 人民邮电出版社出品方: 异步图书副标题: 改善既有代码的设计原作名: Refactoring: Improving the Design of Existing Code,Second Edition译者: …

    2025 年 1 月 15 日
    23900

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信