Flask框架從入門到精通之模型查詢(十三)

知識點: 一、模型查詢python

1、查詢

其實咱們對模型的主要操做就是查詢,在Flask-SQLAlchemy中,支持了不少的查詢方法。查詢操做是經過query對象操做數據。最基本的查詢是返回表中全部數據,能夠經過過濾器進行更精確的數據庫查詢。sql

2、查詢過濾器

Flask-SQLAlchemy中經常使用過濾器:數據庫

過濾器 說明
filter() 把過濾器添加到原查詢上,返回一個新查詢
filter_by() 把等值過濾器添加到原查詢上,返回一個新查詢
limit() 使用指定的值限定原查詢返回的結果
offset() 偏移原查詢返回的結果,返回一個新查詢
order_by() 根據指定條件對原查詢結果進行排序,返回一個新查詢
group_by() 根據指定條件對原查詢結果進行分組,返回一個新查詢

3、查詢執行器

Flask-SQLAlchemy中經常使用執行器:flask

方法 說明
all() 以列表形式返回查詢的全部結果
first() 返回查詢的第一個結果,若是未查到,返回None
first_or_404() 返回查詢的第一個結果,若是未查到,返回404
get() 返回指定主鍵對應的行,如不存在,返回None
get_or_404() 返回指定主鍵對應的行,如不存在,返回404
count() 返回查詢結果的數量
paginate() 返回一個Paginate對象,它包含指定範圍內的結果

4、查詢

咱們在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>
複製代碼
  • filter的邏輯與
# 查詢名字以君結尾而且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

image
相關文章
相關標籤/搜索