Flask入門資料庫的查詢集與過濾器(十一)

誠實善良小郎君發表於2018-06-07

1 查詢集 : 指資料查詢的集合

  1. 原始查詢集: 不經過任何過濾返回的結果為原始查詢集
  2. 資料查詢集: 將原始查詢集經過條件的篩選最終返回的結果

查詢過濾器:

過濾器 功能
cls.query.filter(類名.屬性名 條件操作符 條件) 過濾特定條件,返回的是query物件
cls.query.filter_by(關鍵字引數對) 單條件查詢,條件必須關鍵字引數,而且and連線
cls.query.offset(num)/查詢集物件.offset(num) 針對filter查詢集物件偏移
cls.query.limit(num) 針對查詢集取兩條資料
cls.query.order_by(屬性名).limit(num)
cls.query.order_by( -屬性名).limit(num)
按屬性名排序,取limit(num) 升序排列
按屬性名排序,取limit(num) 降序排列
cls.query.groupby() 原查詢分組,返回新查詢

查詢執行函式

查詢執行方法 說明
cls.query.all() 所有的資料查詢集,返回物件列表,不能鏈式呼叫
cls.query.first() 取第一個
cls.query.get(值) User.query.get(10) 取得id的值對應的資料
cls.query.filter().count() 返回查詢結果數量
cls.query.filter().paginate() 返回paginate物件,此物件用於分頁
cls.query.filter(類名.屬性名.like(`%值%`)) like模糊查詢
cls.query.filter(類名.屬性名.contains(`值`)) contains包含某個值
cls.query.filter(User.username.startswith(`張`)) startswith 以…開頭/endswith以…結尾
cls.query.filter(User.id.in_([list])) in_ 和 not in 是否包含某個範圍內
cls.query.filter(User.id.is_(None)) is_ isnot 查詢為null/不為null 的資料

2 查詢過濾器例項

(1) all() 得到所有的資料查詢集 返回列表

類名.query.all() 不能夠鏈式呼叫

@view.route(`/all/`)
def all():
    data = User.query.all()
    print(data)
    return `刪除資料`
(2) filter() 過濾預設查詢所有

類名.query.filter()

類名.query.filter(類名.屬性名 條件操作符 條件)

#filter 獲取所有資料查詢集
@view.route(`/filter/`)
def filter():
    # data = User.query.filter()
    # data = User.query.filter(User.username==`王五`)
    data = User.query.filter(User.username==`王五`,User.sex==False)
    print(data)
    for i in data:
        print(i.username,i.sex)
    return `刪除資料`
(3) filter_by() 單條件查詢
@view.route(`/filter_by/`)
def filter_by():
    # data = User.query.filter_by()
    data = User.query.filter_by(age=18)
    #只能為下面這種關鍵字的用法   且多個新增為and操作
    # data = User.query.filter_by(username=`王五`,sex=False)
(4) offset(num) 偏移量
@view.route(`/offset/`)
def offset():
    # data = User.query.filter().offset(1)
    # data = User.query.filter().offset(2)
    #錯誤的用法
    data = User.query.all().offset(2)
    # print(User.query.filter())
    # print(data)
    # for i in data:
    #     print(i.username,i.sex)
    return `刪除資料`
(5) limit() 取值
@view.route(`/offsetlimit/`)
def offsetlimit():
    data = User.query.offset(2).limit(2)
    print(data)
    for i in data:
        print(i.username,i.sex)
    return `limit`
(6) order_by() 排序
  1. 預設升序
  2. -屬性名
@view.route(`/orderby/`)
def orderby():
    #升序
    data = User.query.order_by(User.age).limit(1)
    #降序
    data = User.query.order_by(-User.age).limit(1)

3 查詢執行函式

(1) first() 取出一條資料
@view.route(`/first/`)
def first():
    # data = User.query.first() == User.query.get(1)
    # data = User.query.order_by(-User.age).first()
    data = User.query.order_by(User.age).first()
    print(data.age)
    print(data.username)
    # for i in data:
    #     print(i.username,i.sex)
(2) get() 取得id值的資料

查詢成功 返回 物件

查詢失敗 返回 None

data = User.query.get(10)  #找到id=10的資料
print(data)
(3) contains 包含關係

類名.query.filter(類名.屬性名.contains(`值`))

data = User.query.filter(User.username.contains(`五`))
(4) like 模糊查詢

類名.query.filter(類名.屬性名.like(`%值%`))

data = User.query.filter(User.username.like(`%張%`)) #包含張
data = User.query.filter(User.username.like(`%張`))  #以張作為結尾 
data = User.query.filter(User.username.like(`張%`))  #以張作為開頭
(5) startswith 以…開頭 endswith以…結尾
data = User.query.filter(User.username.startswith(`張`)) #以 張作為開頭
data = User.query.filter(User.username.endswith(`張`))   #以張作為結尾
(6) 比較運算子
1. __gt__ 大於
2. __ge__ 大於等於
3. __lt__ 小於
4. __le__ 小於等於
5. >   <
6. >=  <=
7. !=   ==
data = User.query.filter(User.id>1) #查詢id大於1的資料
data = User.query.filter(User.id.__gt__(1)) #查詢id大於1的資料
data = User.query.filter(User.id.__ge__(1)) #查詢id大於1的資料
data = User.query.filter(User.id>=1) #查詢id大於1的資料
data = User.query.filter(User.id<3) #查詢id大於1的資料
data = User.query.filter(User.id.__lt__(3)) #查詢id大於1的資料
(7) in_ 和 not in 是否包含某個範圍內
#in的使用
@view.route(`/in/`)
def myin():
    data = User.query.filter(User.id.in_([1,2,3,4])) #在...範圍內
    data = User.query.filter(~User.id.in_([1,2,3,4])) #not in不再...範圍內
    data = User.query.filter(User.username.in_([`張三`,`王五`]))
    return render_template(`show.html`,data=data)
(8) is_ / isnot 查詢為null/不為null 的資料
#對於null資料的處理
@view.route(`/null/`)
def null():
    #查詢為null資料的
    data = User.query.filter(User.username.is_(None))
    data = User.query.filter(User.username == None)
    data = User.query.filter(~User.username.isnot(None))
    #查詢不為null資料的
    data = User.query.filter(~User.username.is_(None))
    data = User.query.filter(User.username.isnot(None))
    data = User.query.filter(User.username != None)
    
    return render_template(`show.html`,data=data)
(9) count 統計
@view.route(`/count/`)
def mycount():
    #統計性別為sex的資料條數
    data = User.query.filter(not_(User.sex == True)).count()
    #統計所有資料的條數
    data = User.query.filter().count()
    data = User.query.count()
    return `{}條資料`.format(data)

4 資料庫邏輯查詢

from sqlalchemy import and_,or_,not_
(1) 邏輯與 and_
#邏輯操作
@view.route(`/and/`)
def myand():
    data = User.query.filter(User.sex==True,User.age<20)
    data = User.query.filter(User.sex==True).filter(User.age<20)
    data = User.query.filter(and_(User.sex==True,User.age<20))
    return render_template(`show.html`,data=data)
(2) 邏輯或 or_
#邏輯操作
@view.route(`/or/`)
def myor():
    #or
    data = User.query.filter(or_(User.sex==True,User.age<20),User.id.in_([1,2,3]))
    #and 和 or的 一起使用
    data = User.query.filter(or_(User.sex==True,User.age<20))
    return render_template(`show.html`,data=data)
(3) 邏輯非 not_
#邏輯操作
@view.route(`/not/`)
def mynot():
    data = User.query.filter(not_(User.sex==True))
    #錯誤寫法只能有一個條件
    data = User.query.filter(not_(User.sex==True,User.id!=1))
    data = User.query.filter(~User.sex==True)
    return render_template(`show.html`,data=data)

5 flask-migrate 檔案的遷移

安裝

  1. flask-script
  2. flask-migrate

使用

from flask_migrate import Migrate,MigrateCommand
migrate = Migrate(app,db)   #將app與db進行關聯
manager = Manager(app)
manager.add_command(`db`,MigrateCommand) #給manage新增遷移檔案的命令db
(1) 生成遷移檔案目錄

python3 manage.py db init

生成 一個 migrations的遷移檔案目錄

(2) 生成遷移檔案

python3 manage.py db migrate

(3) 執行遷移檔案

python3 manage.py db upgrade

相關文章