查询条件

前文中提到过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)

两个语句输出的结果相同

Flask ORM 学习笔记Part11:数据查询(四)_数据查询

或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进行处理,结果如下

Flask ORM 学习笔记Part11:数据查询(四)_sqlalchemy_02