知识点: 一、模型查询python
其实咱们对模型的主要操做就是查询,在Flask-SQLAlchemy中,支持了不少的查询方法。查询操做是经过query对象操做数据。最基本的查询是返回表中全部数据,能够经过过滤器进行更精确的数据库查询。sql
Flask-SQLAlchemy中经常使用过滤器:数据库
过滤器 | 说明 |
---|---|
filter() | 把过滤器添加到原查询上,返回一个新查询 |
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
limit() | 使用指定的值限定原查询返回的结果 |
offset() | 偏移原查询返回的结果,返回一个新查询 |
order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
Flask-SQLAlchemy中经常使用执行器:flask
方法 | 说明 |
---|---|
all() | 以列表形式返回查询的全部结果 |
first() | 返回查询的第一个结果,若是未查到,返回None |
first_or_404() | 返回查询的第一个结果,若是未查到,返回404 |
get() | 返回指定主键对应的行,如不存在,返回None |
get_or_404() | 返回指定主键对应的行,如不存在,返回404 |
count() | 返回查询结果的数量 |
paginate() | 返回一个Paginate对象,它包含指定范围内的结果 |
咱们在ipython3中测试:bash
from flask_db import *
复制代码
Type.query.all()
#[<Type 4>, <Type 2>, <Type 1>, <Type 3>]
复制代码
Hero.query.all()
#[<Hero 1>, <Hero 2>, <Hero 3>, <Hero 4>, <Hero 5>]
复制代码
Hero.query.get(1)
# <Hero 1>
复制代码
Hero.query.first()
# <Hero 1>
复制代码
# 查询名字是王昭君的对象
Hero.query.filter_by(name='王昭君').all()
# [<Hero 3>]
Hero.query.filter_by(name='王昭君').first()
# <Hero 3>
复制代码
# 查询名字以君结尾而且type_id等于3的
Hero.query.filter_by(name='王昭君',type_id=3).first()
# <Hero 3>
复制代码
# 查询名字以君结尾而且type_id等于3的
# filter_by是=号,在filter中是==号
# filter_by不须要指定类名,filter须要指定
Hero.query.filter(Hero.name=='王昭君',Hero.type_id==3).first()
# <Hero 3>
复制代码
# 查询名字以君结尾或type_id等于3的
from sqlalchemy import or_
Hero.query.filter(or_(Hero.name.endswith('君'),Hero.type_id==3)).all()
# [<Hero 3>, <Hero 4>]
复制代码
# 跳过前2条数据,从第三条数据开始取所有
Hero.query.offset(2).all()
# [<Hero 3>, <Hero 4>, <Hero 5>]
# 跳过前2条数据,从第三条数据开始取2条
Hero.query.offset(2).limit(2).all()
#[<Hero 3>, <Hero 4>]
复制代码
#降序查询
Hero.query.order_by(Hero.id.desc()).all()
# [<Hero 5>, <Hero 4>, <Hero 3>, <Hero 2>, <Hero 1>]
#升序查询
Hero.query.order_by(Hero.id.asc()).all()
# [<Hero 1>, <Hero 2>, <Hero 3>, <Hero 4>, <Hero 5>]
复制代码
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 1>
type = Type.query.get(1)
type.heros
# [<Hero 1>]
复制代码
若是想让查询的过程当中显示出自定义信息。能够在模型类中重写__repr__方法。例如我在两个模型加上以下代码:session
def __repr__(self):
return self.name
复制代码
在进行查询:测试
type = Type.query.get(1)
type.heros
# [后羿]
复制代码
欢迎关注个人公众号:spa