前面的笔记,从Marshmallow开始就稍微有些跑题,今天记录一下如何使用Flask-SQLAlchemy进行数据查询。
查询
语法糖
在前文中,有定义过一系列的model类,这里一Account类作为示例。
from app import app
from model import *
from schema import *
from pprint import pprint
# from sqlalchemy import func
with app.app_context():
a_s = AccountSchema()
r1 = db.session.query(Account).filter(Account.id == 1).first()
pprint(a_s.dump(r1))
print("语法糖写法")
r2 = Account.query.filter(Account.id == 1).first()
pprint(a_s.dump(r2))
Account.query
这是一种简化的查询方式,是 Flask-SQLAlchemy 提供的一种高级语法糖。它的背后是 db.session.query(Account)
的简写。通过 Account.query,你可以直接在模型类(例如 Account)上进行查询,而不需要显式地使用 db.session.query
。这种方式更为简洁,适用于基本的查询操作。
filter与filter_by的查询条件
filter
和 filter_by
是 Flask-SQLAlchemy 中用于构建查询条件的两个方法,它们有一些区别:
- 使用方式:
filter
方法:filter
方法是更通用和灵活的方法,它可以接受任意的 SQL 表达式,条件可以使用比较运算符、逻辑运算符等。你可以使用filter
方法来构建复杂的查询条件。
# 使用 filter 方法进行复杂的查询
Profile.query.filter(Profile.height > 160, Profile.fullname.like('王%')).all()
filter_by
方法:filter_by
方法更简化,它用于进行等值比较,只需要提供字段名和字段值即可。这个方法更适用于简单的等值条件。
# 使用 filter_by 方法进行等值比较
Profile.query.filter_by(fullname='王武').all()
完整代码
from app import app
from model import *
from schema import *
from pprint import pprint
# from sqlalchemy import func
with app.app_context():
a_s = AccountSchema()
print("使用filter方法")
r1 = Profile.query.filter(Profile.height > 160, Profile.fullname.like('王%')).all()
pprint(r1)
print("使用filter_by方法")
r2 = Profile.query.filter_by(fullname='王武').all()
pprint(r2)
- 参数形式:
filter
方法:filter
方法的参数是表达式,你可以使用 SQLAlchemy 提供的丰富功能的表达式语言,包括比较运算符、逻辑运算符等。filter_by
方法:filter_by
方法的参数是字段名和字段值,用于进行等值比较。它提供了一种更简单的语法糖,适用于简单的查询条件。
- 组合查询条件:
filter
方法:filter
方法可以使用多个参数,这些参数之间默认是 AND 的关系。你可以通过使用逻辑运算符来组合条件,实现更复杂的查询。filter_by
方法:filter_by
方法只能进行等值比较,而且参数之间默认是 AND 关系。对于多个条件的组合,需要使用多次调用filter_by
或者结合使用filter
。
综上所述,filter
方法更为通用和灵活,适用于构建复杂的查询条件,而 filter_by
方法更简化,适用于简单的等值比较。在实际使用中,可以根据查询的复杂度和灵活性需求选择使用其中一个方法。