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

相关推荐

  • 【2024最新版】Java JDK安装配置全攻略:图文详解

    目录 1. 引言 2. 准备工作 2.1 确定操作系统 2.2 检查系统要求 2.3 下载JDK安装包 3. 安装步骤(以Windows系统为例) 4. 配置环境变量 4.1 jdk配置验证 4.2 配置JAVA_HOME环境变量 4.3 配置Path环境变量 4.4 验证jdk是否配置成功 5. 结语 1. 引言 随着技术的不断发展和更新,Java作为世界…

    2024 年 12 月 28 日
    13800
  • 深入理解 Java 接口的回调机制

    前言 回调是一种非常重要的编程技术,它广泛应用于事件驱动的编程、异步任务和框架设计中。在 Java 中,回调机制通常通过 接口 来实现。本篇博客将详细解析 Java 接口的回调原理、实现方式,以及实际开发中的应用场景。 泪崩了,期末JAVA编程考了回调,小编不会。 一、什么是回调? 回调(Callback) 是指通过将一个方法作为参数传递给另一个方法,在某些…

    2025 年 1 月 15 日
    16000
  • 电商项目-网站首页高可用(一)

    “`markdown 一、Nginx概览 Nginx,一个以高性能著称的HTTP服务器,是处理高并发请求的理想选择。在单台Tomcat服务器中,理论上最多只能处理500个并发连接,这对于流量密集的首页而言远远不够,容易导致服务崩溃。对于Tomcat集群而言,虽然可以扩展至5台服务器,但超过这个数量,性能反而会下降。 因此,在服务器选型时,Nginx是一个不…

    未分类 2024 年 12 月 24 日
    15300
  • 一步到位:购买适合 SEO 的域名全攻略

    选择一个对 SEO 友好的域名不仅可以提高搜索引擎排名,还能增强品牌影响力。以下是简化优化后的购买流程: 1. 检查域名历史,确保无负面记录 在购买域名前,务必确认它没有被封锁或拉黑,并且历史记录与您的行业相关: 检查域名安全性和历史 VirusTotal:查看域名是否被列为不安全。 Web Archive:查看域名以前的用途,判断是否有不良记录或与您的行业…

    2024 年 12 月 30 日
    15700
  • 【Java 学习】Java抽象类详解:从理论到实践,带你迈向面向对象的深度思考!

    💬 欢迎讨论:如对文章内容有疑问或见解,欢迎在评论区留言,我需要您的帮助! 👍 点赞、收藏与分享:如果这篇文章对您有所帮助,请不吝点赞、收藏或分享,谢谢您的支持! 🚀 传播技术之美:期待您将这篇文章推荐给更多对需要学习Java语言、低代码开发感兴趣的朋友,让我们共同学习、成长! 1. 什么是抽象类? 举一个Animal类、Cat类和Dog类的例子: “`j…

    2025 年 1 月 15 日
    16200

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信