SQLAlchemy中filter

filter_by() 和 filter() 的最主要的区别:

模块 语法 ><(大于和小于)查询 and_和or_查询
filter_by() 直接用属性名,比较用= 不支持 不支持
filter() 用类名.属性名,比较用== 支持 支持

谈 filter_by() 的语法之前先看下 filter_by() 的内部源码,去掉注释之后如下:

def filter_by(self, **kwargs):
        clauses = [_entity_descriptor(self._joinpoint_zero(), key) == value
                   for key, value in kwargs.items()]
        return self.filter(sql.and_(*clauses))

可以看出,filter_by() 只接受键值对参数,所以 filter_by() 不支持><(大于和小于)和 and_、or_查询

现在有 mysql 的 user 数据库表,存储内容如下图,下面通过例子来说明两种查询方式的用法:

user表

filter_by()
       查询 user 表里面名字等于 Tom 的:
       db.session.query(User).filter_by(name='Tom').all()
       查询 user 表里面名字等于 Tom 并且年龄等于 18:
       db.session.query(User).filter_by(name='Tom', age=18).all()
       比如新的需求,查询 user 表里面名字等于 Tom 或者年龄等于 18 的用户,那么 filter_by() 就满足不了要求了

filter()
       查询 user 表里面名字等于 Tom 的:
       db.session.query(User).filter(User.name == 'Tom').all()
       查询 user 表里面名字等于 Tom 并且年龄等于 18:
       db.session.query(User).filter(User.name == 'Tom', User.age == 18).all()
       也可以这样:
       db.session.query(User).filter(User.name == 'Tom').filter(User.age == 18).all()
       如果想使用 and 拼接需要用以下方式:
       db.session.query(User).filter(and_(User.name == 'Tom', User.age == 18)).all()
       以下的方式 and 后面的 User.age == 18 不会生效:
       db.session.query(User).filter(User.name == 'Tom' and User.age == 18).all()
       查询 user 表里面名字等于 Tom 的或者年龄等于 18:
       db.session.query(User).filter(or_(User.name == 'Tom', User.age == 18)).all()
       查询 user 表里面名字等于 Tom 的并且年龄大于 18
       db.session.query(User).filter(User.name == 'Tom', User.age > 18).all()
       查询 name 中包含字母 a 的所有数据(模糊查询)
       db.session.query(User).filter(User.name.like('%{0}%'.format("a"))).all()

以上的例子都是查询中使用比较多的,使用方面看大家喜好,filter_by() 对组合查询等等支持的不是很好,但是语法相对 filter() 简洁一些; 另外 filter() 还有很多其他的查询,大家可以自己去多多探讨。。。

(0)

相关推荐

  • 第46天:Flask数据持久化

    Web 应用离不开数据存储,今天就来学习下 Flask 中如何与数据库交互,最后我们将做一个提交的实例 Flask 中最方便用的数据库框架是 flask_sqlalchamy,是对 SQLAlcham ...

  • FastAPI操作database

    简单记录一下使用FastAPI完成对数据库的CRUD操作.在参考文档的基础上,增加了U.D部分,全部代码可以参考Github .https://fastapi.tiangolo.com/tutoria ...

  • Python Flask Restful token验证

    服务端: #!/usr/bin/env python import os import time from flask import Flask, abort, request, jsonify, g ...

  • Python中lambda用法和filter()函数

    "微信公众号" 目录 1. lambda用法. 2. filter()用法. 1. lambda用法. Python使用lambda来创建匿名函数. lambda只是一个表达式,函 ...

  • Excel中特别有用的函数之Filter

    今天继续介绍Excel中的新函数系列:FILTER. 就在准备这篇文章时,我又一次感受到了Excel新函数的威力,不得不说,包括我们前面介绍过的SORT,UNIQUE,今天介绍的FILTER在内的Ex ...

  • web.xml 中的listener、 filter、servlet 加载顺序及其详解

    转载自:https://www.cnblogs.com/Jeely/p/10762152.html 一.概述 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<l ...

  • FILTER、XLOOKUP、VLOOKUP、LOOKUP四个函数大PK,谁才是你心目中最厉害的函数?

    昨天提到WPS最新版本有了XLOOKUP函数,其实Office365有的函数,目前基本都有了.今天跟卢子来看看FILTER函数,这个作用更大. 有一个缺陷需要事先说明,在使用FILTER函数的时候,O ...

  • 在微信中与好友聊天时如何拍摄照片发送给对方

    卡饭网梦在深巷2019-04-20 17:05:36 随着科技的发展,微信已经成为人们日常生活中必不可少的工具,当我们在使用微信与好友聊天时,是否可以直接拍摄图片给好友看呢?接下来就由小编来告诉大家. ...

  • 常见的10种病最怕的中成用药,中医医师医...

    常见的10种病最怕的中成用药,中医医师医师都在用,建议收藏备用! 1.子宫肌瘤--"最怕"--宫瘤消颗粒 2.口疮--"最怕"--知柏地黄丸 3.颈椎病--&q ...

  • 如何在微信中现拍照片给好友?

    卡饭网梦在深巷2019-01-16 13:40:18 相信很多小伙伴都有在使用微信,在其中如何才能现拍照片给好友呢?方法很简单,下面小编就来为大家介绍. 具体如下: 1. 首先,打开手机上的微信.进入 ...

  • 中医医生总结:6种常见病.对症使用的中成...

    中医医生总结:6种常见病.对症使用的中成药,便宜好用,建议保存备用   ▄气滞血瘀,湿热蕴结所致的盆腔炎--对症使用--坤复康胶囊  组成成分:女贞子.南刘寄奴.赤芍.苦参.香附.猪苓.乌药.粉萆解. ...

  • 家中常备7种儿童常用的中成.药,几块钱轻...

    家中常备7种儿童常用的中成.药,几块钱轻松解决孩子厌食.消化不良大便干结.感冒   1.小儿豉翘清热颗粒   比较多用于小儿风热感冒滞证,症见发热咳嗽,鼻塞流涕,咽红肿痛,纳呆口渴,脘腹胀满,便秘或者 ...