python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据
04 如何过滤(筛选)数据库中的数据
从数据库中获筛选数据主要应用以下几个接口:filter
、filter_by
、以及 where
。前两个在 02已经展开说过,先展开说where
接口
前情提要:依赖03提及的model
【本质上就是数据库的链接,有可忽视】
当前的数据库表内容如下,仅作例子,不相同根据自身数据库操作即可:

4-1 通过where进行筛选
同时筛选多个(或者一个):
results = session.query(User).where(User.age > 23, User.name == "arthur").all()
where
接口用法与filter
类型,同样可以接收多个判定条件作为筛选,同理也可以接收单个判定条件,只需要逗号隔开即可
使用逻辑运算筛选数据
或运算
可以使用
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)
否则输出的结果就是这样了:
4-2 综合使用where进行筛选
经过上述的知识,已经能掌握逻辑运算筛选了,出个题,读者可以自行尝试,能够达到自己预期的效果则过关了。
题目:筛选名字不为xxx[name1]或 年龄大于xx[age1] 小于xx[age2] [age2>age1]
这里以名字不为
arthur
,或年龄大于22,小于30code:
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()
关于filter
、filter_by
接口见02 中的增删查改吧,讲的应该还算详细。
python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据