查询过滤器
Flask-SQLAlchemy中常用过滤器:
filter() 把过滤器添加到原查询上,返回一个新查询
filter_by() 把等值过滤器添加到原查询上, 返回一个新查询
limit() 使用指定的值限定原查询返回的结果
offset() 偏移原查询返回的结果, 返回一个新查询
order_by() 根据指定条件对原查询结果进行排序,返回一个新查询
group_by() 根据指定条件对原查询结果进行分组,返回一个新查询
查询执行器
Flask-SQLAlchemy中常用执行器:
all() 以列表形式返回查询的所有结果
first() 返回查询的第一个结果,如果未查到,返回None
first_or_404()返回查询的第一个结果,如果未查到,返回404
get()返回指定主键对应的行,如不存在,返回None
get_or_404()返回指定主键对应的行,如不存在,返回404
count()返回查询结果的数量
paginate()返回一个Paginate对象,它包含指定范围内的结果
查询
我们在ipython3中测试:
from flask_db import *
查询全部
Type.query.all()
Hero.query.all()
根据主键查询
Hero.query.get(1)
查询第一条
Hero.query.first()
根据名字过滤
# 查询名字是王昭君的对象
Hero.query.filter_by(name='王昭君').all()
Hero.query.filter_by(name='王昭君').first()
逻辑与
# 查询名字以君结尾并且type_id等于3的
Hero.query.filter_by(name='王昭君',type_id=3).first()
filter的逻辑与
# 查询名字以君结尾并且type_id等于3的 # filter_by是=号,
在filter中是==号 # filter_by不需要指定类名,filter需要指定
Hero.query.filter(Hero.name=='王昭君',Hero.type_id==3).first()
逻辑或
# 查询名字以君结尾或type_id等于3的
from sqlalchemy import or_
Hero.query.filter(or_(Hero.name.endswith('君'),Hero.type_id==3)).all()
偏移查询
# 跳过前2条数据,从第三条数据开始取全部
Hero.query.offset(2).all()
# 跳过前2条数据,从第三条数据开始取2条
Hero.query.offset(2).limit(2).all()
排序
#降序查询
Hero.query.order_by(Hero.id.desc()).all()
#升序查询
Hero.query.order_by(Hero.id.asc()).all()
分组
from sqlalchemy import func # 根据type_id进行分组统计 db.session.query(Hero.type_id,func.count(Hero.type_id)).group_by(Hero.type_id).all()
关联查询
hero = Hero.query.get(1)
hero.type
type = Type.query.get(1)
type.heros
如果想让查询的过程中显示出自定义信息。可以在模型类中重写__repr__方法。例如我在两个模型加上如下代码:
def __repr__(self):
return self.name
在进行查询:
type = Type.query.get(1)
type.heros
更新
第一种
hero = Hero.query.get(1)
hero.name = '伽罗'
db.session.add(hero)
db.session.commit()
第二种
Hero.query.filter_by(id=1).update({"name":"虞姬","gender":"女"}) db.session.commit()
删除
hero = Hero.query.get(4)
db.session.delete(hero)
db.session.commit()