查询条件
前文中提到过filter与filter_by,可以将查询条件作为参数传递给这两个方法。
如果是一些比较简单的等式判断作为查询条件,可以使用filter_by,直接使用模型的属性名称作为参数即可。
如果是较复杂的可以加上一些逻辑条件,实现与或非,以及多个filter进行链式过滤。
在Flask-SQLAlchemy中,使用filter方法时,可以使用不同类型的条件来筛选数据。这些条件可以通过逻辑运算符(例如and_、or_等)组合起来,以构建更复杂的查询条件。以下是一些常见的条件类型:
等于==
from app import app
from model import *
from pprint import pprint
with app.app_context():
r = Profile.query.filter(Profile.gender == 'F').all()
pprint(r)
大于> 小于< 大于等于>= 小于等于<=
from app import app
from model import *
from pprint import pprint
with app.app_context():
r = Profile.query.filter(Profile.age > 24).all()
pprint(r)
r = Profile.query.filter(Profile.age < 24).all()
pprint(r)
r = Profile.query.filter(Profile.age >= 24).all()
pprint(r)
r = Profile.query.filter(Profile.age <= 24).all()
pprint(r)
逗号, _and
下文的例子中也有filter中的逗号,以及使用_and
进行过滤。
这两种写法在功能上是等价的,不会有实质性的区别。两者都是用来构建 SQL 查询的条件,只是写法上有些许差异。
使用 and_ 函数来显式地表示 AND 关系,将两个条件连接在一起
使用逗号,多个条件之间默认为 AND 关系。
from app import app
from model import *
from pprint import pprint
from sqlalchemy import func
from sqlalchemy import and_, or_
with app.app_context():
# 多个查询条件写在一个filter中,与链式的写法,得到的结果视相同的。其隐含的关系是and
# 同样的使用_and返回的结果也是等价的
pprint(r)
print('逗号')
r = Profile.query.filter(Profile.age > 24, Profile.age < 30).all()
pprint(r)
print('_and')
r = Profile.query.filter(and_(Profile.age > 24, Profile.age < 30)).all()
pprint(r)
两个语句输出的结果相同
或or_
from app import app
from model import *
from pprint import pprint
from sqlalchemy import func
from sqlalchemy import and_, or_
with app.app_context():
r = Profile.query.filter(or_(Profile.age < 24, Profile.age > 50)).all()
pprint(r)
包含in_ 不包含~
from app import app
from model import *
from pprint import pprint
with app.app_context():
r = Profile.query.filter(Profile.age.in_([24,25,30])).all()
pprint(r)
r = Profile.query.filter(~Profile.age.in_([24,25,30])).all()
pprint(r)
模糊匹配like ilike
from app import app
from model import *
from pprint import pprint
with app.app_context():
r = Profile.query.filter(Profile.fullname.like('i%')).all()
pprint(r)
链式过滤
用多个filter方法链接在一起的写法被称为链式过滤(Chaining Filters)。通过连续调用多个filter方法,可以构建更复杂的查询条件。比如这个示例
Profile.query.filter(Profile.age > 24).filter(Profile.age < 30).all()
通过两个filter方法将两个年龄条件链接在一起,表示查询年龄在25到29之间的Profile记录。
这种链式过滤的写法使得代码清晰且易于理解,同时也能更灵活地构建复杂的查询条件。
from app import app
from model import *
from schema import *
from pprint import pprint
with app.app_context():
r = Profile.query.join(Account).filter(Profile.gender=='F').filter(Account.account_email.like("%123%")).all()
p_s = ProfileSchema()
rr = [p_s.dump(i) for i in r]
pprint(rr)
这个例子中不仅使用了链式过滤还用到了join联合查询
返回结果使用schema的dump进行处理,结果如下