Flask ORM 学习笔记Part09:数据查询(上)
  qdp7fV9qUjiK 2023年12月12日 18 0

前面的笔记,从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))

Flask ORM 学习笔记Part09:数据查询(上)_逻辑运算符


Account.query这是一种简化的查询方式,是 Flask-SQLAlchemy 提供的一种高级语法糖。它的背后是 db.session.query(Account) 的简写。通过 Account.query,你可以直接在模型类(例如 Account)上进行查询,而不需要显式地使用 db.session.query。这种方式更为简洁,适用于基本的查询操作。

filter与filter_by的查询条件

filterfilter_by 是 Flask-SQLAlchemy 中用于构建查询条件的两个方法,它们有一些区别:

  1. 使用方式:
  • 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)

Flask ORM 学习笔记Part09:数据查询(上)_语法糖_02

  1. 参数形式:
  • filter 方法:
    filter 方法的参数是表达式,你可以使用 SQLAlchemy 提供的丰富功能的表达式语言,包括比较运算符、逻辑运算符等。
  • filter_by 方法:
    filter_by 方法的参数是字段名和字段值,用于进行等值比较。它提供了一种更简单的语法糖,适用于简单的查询条件。
  1. 组合查询条件:
  • filter 方法:
    filter 方法可以使用多个参数,这些参数之间默认是 AND 的关系。你可以通过使用逻辑运算符来组合条件,实现更复杂的查询。
  • filter_by 方法:
    filter_by 方法只能进行等值比较,而且参数之间默认是 AND 关系。对于多个条件的组合,需要使用多次调用 filter_by 或者结合使用 filter

综上所述,filter 方法更为通用和灵活,适用于构建复杂的查询条件,而 filter_by 方法更简化,适用于简单的等值比较。在实际使用中,可以根据查询的复杂度和灵活性需求选择使用其中一个方法。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月12日 0

暂无评论

qdp7fV9qUjiK