文章目录
昨日回顾
- RequestParser解析请求如何实现?
- 如何序列化数据?
- 如何定制响应的json格式?
- ORM是什么?
- Flask中模型类如何创建?
- 迁移脚本如何创建?如何实现数据库迁移?
- 增删改查语法是什么?
今日内容
- 单表查询详解
- 关系查询
- 一对多关系
- 多对多关系
- 优化查询
- Flask-SQLAlchemy执行自定义SQL语句
1. 单表数据查询
1.1 all(), first(), get()的使用
# python manage.py shell 进入flask shell命令行,可以操作模型类
# flask > 2 可以直接使用flask shell进入
# all():查询所有数据,返回obj list
user_list = User.query.all()
# 如return marshal(user_list, resource_fields)
# first(): 表中第一条数据,返回对象
user = User.query.first()
# get(): 根据主键值查询,查询不到返回None
user = User.query.get(1) # 返回id=1的对象
1.2 filter(), filter_by实现过滤操作
- 条件查询提供了filter()与filter_by来实现;
- filter_by可以看做是filter的简写方式.
- 过滤返回BaseQuery对象
# filter
# 获取一个对象
User.query.filter(User.username=='name').first()
User.query.filter(User.username=='name').one_or_none() # not get
# 获取所有的对象
User.query.filter(User.username=="jack").all()
# filter_by()实现 简单的 条件查询
# 必须使用first或all 获取对象
User.query.filter_by(username="tom").first()
1.3 分页与排序
- offset/limit 联合使用
- 返回BaseQuery对象
# 表中的所有数据 的分页
# 请求url /user/user?page=2&pageSize=3
page = request.args.get("page")
page = int(page)
pageSize = request.args.get("pageSize")
pageSize = int(pageSize)
data = User.query.offset((page-1)*pageSize).limit(pageSize).all()
return marshal(data, resource_fields)
# 查询 并分页 过滤返回的是查询语句
User.query.filter_by(age=18).offset(2).limit(3).all()
# 跳过二条开始查询,限制输出3条
注意: offset与limit顺序调换, 不影响查询结果
# 排序
User.query.order_by(User.age.asc()).all()
#按照年龄降序排序
User.query.order_by(User.age.desc()).all()
# 注意顺序
books = Book.query.filter_by(title="红楼梦").order_by(Book.id.asc()).offset(0).limit(1).all()
最后一定要first()或者all()
1.4 逻辑运算与聚合
or_, 或
and_, 与
not_,非
_lt_ 小于
# 逻辑运算
from sqlalchemy import or_