首页 > Python资料 博客日记

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

2025-01-11 00:00:04Python资料围观6

Python资料网推荐python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据这篇文章给大家,欢迎收藏Python资料网享受知识的乐趣

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

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

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

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

image-20250110174048807

4-1 通过where进行筛选

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

    results = session.query(User).where(User.age > 23, User.name == "arthur").all()
    
    • where 接口用法与 filter类型,同样可以接收多个判定条件作为筛选,同理也可以接收单个判定条件,只需要逗号隔开即可
  2. 使用逻辑运算筛选数据

    • 或运算

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

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

      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)
      

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

      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:

    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:

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


版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐