filter 过滤条件
生成 mock 数据
# 创建 session 对象
session = sessionmaker(bind=engine)()
# 本地生成mock数据
for i in range(6):
# 生成随机名字, 长度为4到7个字符
name = ''.join(random.choice(string.ascii_letters) for _ in range(random.randint(4, 7)))
# 生成随机年龄, 范围为20到40
age = random.randint(20, 40)
user = User(name=name, age=age)
# print(user.name, user.age)
session.add(user)
session.commit()
数据库表数据:
equals ==
# ==
# user = session.query(User).filter(User.age == 21).all()
# print(user)
'''
输出结果:[<User(name=KOBND, age=21)>]
'''
not equals !=
# !=
users = session.query(User).filter(User.age != 40).all()
for user in users:
print(user)
'''
输出结果:
<User(name=ypb, age=18)>
<User(name=yxc, age=22)>
<User(name=wwQE, age=23)>
<User(name=nzUjld, age=36)>
<User(name=uzjcgd, age=38)>
<User(name=Kbvifw, age=27)>
<User(name=KOBND, age=21)>
'''
like & ilike
# like
users = session.query(User).filter(User.name.like('y%')).all()
for user in users:
print(user)
'''
输出结果:
<User(name=ypb, age=18)>
<User(name=yxc, age=22)>
'''
# ilike (对大小写不敏感)
users = session.query(User).filter(User.name.ilike('y%')).all()
for user in users:
print(user)
'''
输出结果:
<User(name=ypb, age=18)>
<User(name=yxc, age=22)>
'''
in
# in
users = session.query(User).filter(User.age.in_(range(18, 30))).all()
for user in users:
print(user)
'''
输出结果:
<User(name=ypb, age=18)>
<User(name=yxc, age=22)>
<User(name=wwQE, age=23)>
<User(name=Kbvifw, age=27)>
<User(name=KOBND, age=21)>
'''
not in
# not in
# 第一种写法
users = session.query(User).filter(not_(User.age.in_(range(18, 30))))
# 第二种写法
users = session.query(User).filter(~(User.age.in_(range(18, 30))))
for user in users:
print(user)
'''
输出结果:
<User(name=RPIaXC, age=40)>
<User(name=nzUjld, age=36)>
<User(name=uzjcgd, age=38)>
'''
is null
# is null
# 第一种写法
user = session.query(User).filter(User.age == None).all()
# 第二种写法
user = session.query(User).filter(User.age.is_(None)).all()
print(user)
'''
输出结果:[]
'''
is not null
# is not null
# 第一种写法
users = session.query(User).filter(User.name != None).all()
# 第二种写法
users = session.query(User).filter(User.name.isnot(None)).all()
for user in users:
print(user)
'''
输出结果:
<User(name=ypb, age=18)>
<User(name=yxc, age=22)>
<User(name=wwQE, age=23)>
<User(name=RPIaXC, age=40)>
<User(name=nzUjld, age=36)>
<User(name=uzjcgd, age=38)>
<User(name=Kbvifw, age=27)>
<User(name=KOBND, age=21)>
'''
and
# and
# 第一种写法
user = session.query(User).filter(and_(User.name == 'ypb',User.age == 18)).first()
# 第二种写法
user = session.query(User).filter(User.name == 'ypb',User.age == 18).first()
# 第三种写法
user = session.query(User).filter(User.name == 'ypb').filter(User.age == 18).first()
print(user)
'''
输出结果:<User(name=ypb, age=18)>
'''
or
# or
users = session.query(User).filter(or_(User.age <= 20, User.age >= 30)).all()
for user in users:
print(user)
'''
输出结果:
<User(name=ypb, age=18)>
<User(name=RPIaXC, age=40)>
<User(name=nzUjld, age=36)>
<User(name=uzjcgd, age=38)>
'''
注意
在 SQL 中,NULL
值具有一些特殊的行为,这可能会影响到你的过滤条件。例如,使用 ==
操作符比较一个字段和 NULL
值将不会返回任何结果,即使字段中确实有 NULL
值。在这种情况下,你应该使用 is NULL
或者 is not NULL
。