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

(0)
LomuLomu
上一篇 2025 年 1 月 12 日
下一篇 2025 年 1 月 12 日

相关推荐

  • Java StampedLock:实现原理与最佳实践

    Java StampedLock:实现原理与最佳实践 1. 引言 2. StampedLock概述 2.1 什么是StampedLock? 2.2 核心特性 3. StampedLock的三种模式详解 3.1 写锁(Write Lock) 3.2 悲观读锁(Pessimistic Read Lock) 3.3 乐观读(Optimistic Read) 4. …

    2025 年 1 月 6 日
    64700
  • ChatGPT Plus开通后模型没变化怎么办

    ChatGPT Plus开通后模型没变化怎么办,围绕国内支付、代充开通、续费到账和账号验收整理。

    未分类 2026 年 5 月 29 日
    3700
  • ChatGPT Plus微信支付宝充值流程完整步骤

    国内用户订阅 ChatGPT Plus 时,最需要避免的是账号混淆和支付绕路。先确认目标账号,再按页面提示提交 Session,流程会清楚很多。 如果你想保留自己的使用记录和工作习惯,可以按下面步骤操作。

    未分类 2026 年 6 月 8 日
    3300
  • ChatGPT Plus充值无需国外信用卡实用版

    想用自己的 ChatGPT 账号升级 Plus,最现实的问题通常是支付方式。国内用户更希望用微信或支付宝完成购买,再确认会员开到自己的原账号。 对普通用户来说,这比准备海外支付工具更容易理解。

    未分类 2026 年 6 月 6 日
    3000
  • 基于Redis有序集合实现滑动窗口限流

    滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间段内的请求次数。通过动态地滑动窗口,可以动态调整限流的速率,以应对不同的流量变化。 整个限流可以概括为两个主要步骤: 统计窗口内的请求数量 应用限流规则 Redis有序集合每个value有一个score(分数),基于score我们可以定义一个时间窗口,然后每次…

    2024 年 12 月 31 日
    59000

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信