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

打印 上一主题 下一主题

主题 576|帖子 576|积分 1728

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

从数据库中获筛选数据主要应用以下几个接口:filter、filter_by、以及 where。前两个在 02已经展开说过,先展开说where接口
前情提要:依赖03提及的model【本质上就是数据库的链接,有可忽视】
当前的数据库表内容如下,仅作例子,不相同根据自身数据库操纵即可:
4-1 通过where进行筛选


  • 同时筛选多个(或者一个):
    1. results = session.query(User).where(User.age > 23, User.name == "arthur").all()
    复制代码

    • where 接口用法与 filter类型,同样可以接收多个判定条件作为筛选,同理也可以接收单个判定条件,只需要逗号隔开即可

  • 利用逻辑运算筛选数据

    • 或运算
      可以利用 sqlalchemy.or_ 接口或在where中利用按位或 ”|“ 运算符
      1. results = session.query(User).where( (User.age > 30) | (User.name == "caster") ).all() #两种或的结果是一致的,根据需要选择即可
      2. # results = session.query(User).where(
      3. #     sqlalchemy.or_(
      4. #     User.age > 30, User.name == 'caster',
      5. #     )
      6. # ).all()
      复制代码
      PS:为什么在where中,利用python的按位或运算符 能够和利用ORM库的逻辑或输出结果一样呢?他们按位或与逻辑或原理上是差别等的?
      answer:由于在SQLAlchemy中, sqlalchemy.or_()与 |是等价的,由于SQLAlchemy会自动转换成sqlalchemy.or_();同理后面的逻辑运算符,因此,这两种写法的结果和结果是同等的,都是构建 SQL 查询中的 OR 逻辑。
    • 与运算
      利用的接口换成了  sqlalchemy.and_,以及 &
      1. def query_and():
      2.     # results = session.query(User).where(sqlalchemy.and_(
      3.     #     User.age >= 25, User.name == "caster")
      4.     # )
      5.     results = session.query(User).where((
      6.         User.age >= 25) & (User.name == "caster")
      7.     )
      8.     for result in results:
      9.         print(result)
      复制代码
      但好像筛选都是默认就是全为真。
    • 非运算
      1. def query_by_not():
      2.     results = session.query(User).where(
      3.         sqlalchemy.not_(User.name == 'caster')
      4.     )
      5.     for result in results:
      6.         print(result)
      复制代码
      就是换了个接口,换成 not_ 了,但需要注意,not_只能接受一个参数,假如多个参数:
      1. def query_by_not():#错误示范
      2.     results = session.query(User).where(
      3.         sqlalchemy.not_(User.name == 'caster', User.age == 21)#参数不能多与1个
      4.     )
      5.     for result in results:
      6.         print(result)
      复制代码
      否则输出的结果就是如许了:


4-2 综合利用where进行筛选

颠末上述的知识,已经能把握逻辑运算筛选了,出个题,读者可以自行尝试,能够达到本身预期的结果则过关了。

  • 题目:筛选名字不为xxx[name1]或 年龄大于xx[age1] 小于xx[age2] [age2>age1]
    这里以名字不为 arthur,或年龄大于22,小于30
  • code:
    1. def answer():
    2.     results = session.query(User).where(
    3.         or_(
    4.             not_(User.name=='arthur'), (
    5.                 and_(User.age > 22, User.age < 30)
    6.             )
    7.         )
    8.     ).all()
    9.     for result in results:
    10.         print(result)
    复制代码
all code:
  1. from model import User, Engineimport sqlalchemyfrom sqlalchemy.orm import sessionmakerfrom 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():
  2.     # results = session.query(User).where(sqlalchemy.and_(
  3.     #     User.age >= 25, User.name == "caster")
  4.     # )
  5.     results = session.query(User).where((
  6.         User.age >= 25) & (User.name == "caster")
  7.     )
  8.     for result in results:
  9.         print(result)def query_by_not():
  10.     results = session.query(User).where(
  11.         sqlalchemy.not_(User.name == 'caster')
  12.     )
  13.     for result in results:
  14.         print(result)def answer():
  15.     results = session.query(User).where(
  16.         or_(
  17.             not_(User.name=='arthur'), (
  18.                 and_(User.age > 22, User.age < 30)
  19.             )
  20.         )
  21.     ).all()
  22.     for result in results:
  23.         print(result)if __name__ == '__main__':    # search_by_where()    # query_and()    # query_by_not()    answer()
复制代码
关于filter、filter_by接口见02 中的增删查改吧,讲的应该还算详细。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦应逍遥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表