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

相关推荐

  • ChatGPT Plus办公使用代充开通教程

    国内用户开通 ChatGPT Plus,经常会卡在海外支付方式上。 通过卡密充值,可以先用国内支付购买,再用 Session 确认当前 ChatGPT 账号。这样不需要切换共享账号,也能保留自己的使用记录和工作资料。

    未分类 2026 年 6 月 24 日
    8800
  • Grok Super微信支付订阅开通教程

    Grok Super微信支付订阅开通教程,适合国内用户使用微信支付宝为自己的账号完成充值、订阅或代充开通。

    未分类 2026 年 7 月 11 日
    4800
  • Grok Super无需国外信用卡订阅方法

    Grok Super无需国外信用卡订阅方法,适合国内用户使用微信支付宝为自己的账号完成充值、订阅或代充开通。

    未分类 2天前
    1000
  • 『玩转Streamlit』–集成定时任务

    学习了Streamlit了之后,可以尝试给自己的命令行小工具加一个简单的界面。 本篇总结了我改造自己的数据采集的工具时的一些经验。 1. 概要 与常规的程序相比,数据采集任务的特点很明显,比如它一般都是I/O密集型程序,涉及大量网络请求或文件读写,耗费的时间比较长;而且往往是按照一定的时间间隔周期性地执行。 这样的程序对交互性要求不高,所以我之前都是用命令行…

    2025 年 1 月 12 日
    76100
  • ChatGPT Plus充值无需国外信用卡

    没有国外信用卡,是很多国内用户开通 ChatGPT Plus 时最直接的门槛。官方订阅对支付方式有要求,虚拟卡方案又需要额外维护,购买共享账号虽然看起来简单,但不适合长期输入工作资料和个人内容。通过卡密充值,可以绕开复杂的海外支付准备,把重点放在账号确认和会员开通上。

    未分类 2026 年 6 月 5 日
    12200

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信