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/6380.html

(0)
LomuLomu
上一篇 2025 年 1 月 14 日 下午12:55
下一篇 2025 年 1 月 14 日 下午1:57

相关推荐

  • Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚

    我的个人主页我的专栏:Java-数据结构 ,希望能帮助到大家!!!点赞❤ 收藏❤ 前言 :在 Java编程的广袤世界里,数据结构犹如精巧的建筑蓝图,决定着程序在数据处理与存储时的效率、灵活性以及可扩展性。其中,ArrayList和顺序表作为线性数据结构的典型代表,犹如两颗璀璨的明星,在众多数据处理场景中熠熠生辉。 顺序表,以其简洁而直观的连续内存存储方式,为…

    2024 年 12 月 28 日
    12800
  • 深入解析 Spring AI 系列:以OpenAI与Moonshot案例为例寻找共同点

    今天,我们将重点探讨对接的业务逻辑。为了帮助大家更直观地掌握其中的规律性,我将通过对比OpenAI与《月之暗面》中的Moonshot两个案例来阐述这一点。通过这样的对比,大家可以更清晰地看到,这些对接业务的整体框架其实非常相似。换句话说,我们要做的工作只是其中的一小部分,但它同样是关键的一环。 好了,接下来我们就开始深入了解这个话题。 模型对接 我们首先需要…

    2025 年 1 月 12 日
    10900
  • 深入解析 Spring AI 系列:以OpenAI与Moonshot案例为例寻找共同点

    今天,我们将重点探讨对接的业务逻辑。为了帮助大家更直观地掌握其中的规律性,我将通过对比OpenAI与《月之暗面》中的Moonshot两个案例来阐述这一点。通过这样的对比,大家可以更清晰地看到,这些对接业务的整体框架其实非常相似。换句话说,我们要做的工作只是其中的一小部分,但它同样是关键的一环。 好了,接下来我们就开始深入了解这个话题。 模型对接 我们首先需要…

    2025 年 1 月 13 日
    14700
  • Java 零基础入门学习(小白也能看懂!)

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 小杨近些在学习人工智能方面的知识,发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默…

    2025 年 1 月 14 日
    13700
  • 【GreatSQL优化器-10】find_best_ref

    【GreatSQL优化器-10】find_best_ref 一、find_best_ref介绍 GreatSQL的优化器对于join的表需要根据行数和cost来确定最后哪张表先执行哪张表后执行,这里面就涉及到预估满足条件的表数据,在keyuse_array数组有值的情况下,会用find_best_ref函数来通过索引进行cost和rows的估计,并且会找出最…

    2025 年 1 月 10 日
    14200

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信