Python-SQLAlchemy:第2節:查詢條件設定

Mark發表於2019-02-16

上一篇文章:Python-SQLAlchemy:第1節:SQLAlchemy入門
下一篇文章:Python-SQLAlchemy:第3節:關係操作

在實際程式設計中需要根據各種不同的條件查詢資料庫記錄,SQLAlchemy查詢條件被稱為過濾器。這裡列出了最常用的過濾器的使用方法。

1、等值過濾器(==)

等值過濾器用於判斷某列是否等於某值,是最常用的過濾器。

session.query(Account).filter(Account.user_name==`Mark`) #判斷字串型別
session.query(Account).filter(Account.salary==2000) #判斷數值型別

2、不等過濾器(!=、<、>、<=、>=)

與等值過濾器相對的是不等於過濾器,不等於過濾器可以延伸為幾種形式:不等於、小於、大於、小於等於、大於等於。

session.query(Account).filter(Account.user_name !="mark" ) #不等於字串型別
session.query(Account).filter(Account.salary !=2000) #不等於數值型別
session.query(Account).filter(Account.salary >2000) #大於過濾器
session.query(Account).filter(Account.salary <2000) #小於過濾器
session.query(Account).filter(Account.salary <=2000) #小於等於過濾器
session.query(Account).filter(Account.salary >=2000) #大於等於過濾器

3、模糊查詢(like)

模糊查詢適用於只知道被查詢字串的一部分內容時,通過設定萬用字元的位置,可以查詢出不同的結果。萬用字元用百分號%表示。

假設表中的資料為:

id user_name title salary
1 David Li System Manager 3000
2 Debeca Li Accountant 3000
3 David Backer Engineer 3000
4 Siemon Bond Enfineer 4000
5 Van Berg General Manager NULL
#查詢所有名字包含字母i的使用者,結果包括id為1、2、3、4的4條記錄
session.query(Account).filter(Account.user_name.like(`%i%`))

#查詢所有title中以Manager結尾的使用者,結果包括id為1、5的兩條記錄
session.query(Account).filter(Account.title.like(`%Manager`))

#查詢所有名字中以Da開頭的使用者,結果包括id為1、3的兩條記錄
session.query(Account).filter(Account.user_name.like(`Da%`))

注意:模糊查詢只適用於查詢字串型別,不適用於數值型別。

4、包括過濾器(in_)

當確切的知道要查詢記錄的欄位內容,但是一個欄位有多個內容要查詢時,可以用包含過濾器。

#查詢id不為1,3,5的記錄,結果包含id為2,4的兩條記錄
session.query(Account).filter(~Account.id.in_([1,3,5]))
#查詢工資不為2000、3000、4000的記錄,結果包含id為5的1條記錄
session.query(Account).filter(~Account.id.in_([2000,3000,4000]))
#查詢所有title不為Engineer和Accountant記錄,結果包括id為1、5的兩條記錄
session.query(Account).filter(~Account.title.in_([`Accountant`,`Engineer`]))

5、判斷是否為空(is NULL、is not NULL)

空值NULL是資料庫欄位中比較特殊的值。在SQLAlchemy中支援對欄位是否為空進行判斷。判斷時可以用等值、不等值過濾器篩選,也可以用is、isnot進行篩選。

#查詢salary為空值的記錄,結果包含id為5的記錄
#下面兩方式效果相同
session.query(Account).filter(Account.salary==None)
session.query(Account).filter(Account,salary.is_(None))

#查詢salary不為空值的記錄,結果包含id為1、2、3、4的記錄
#下面兩方式效果相同
session.query(Account).filter(Account.salary!=None)
session.query(Account).filter(Account.salary.isnot(None))

6、非邏輯(~)

當需要查詢不滿足某條件的記錄時可以使用非邏輯。

#查詢id不為1、3、5的記錄,結果包含id為2、4的兩條記錄
session.query(Account).filter(~Account.id.in_([1,3,5]))

#查詢工資不為2000、3000、4000的記錄,結果包含id為5的1條記錄
session.query(Account).filter(~Account.id.in_([2000,3000,4000]))

#查詢所有title不為Engineer和Accountant的記錄,結果包括id為1、5的2條記錄。
session.query(Account).filter(~Account.title.in([`Accountant`,`Engineer`]))

7、與邏輯(and_)

當需要查詢同時滿足多個條件的記錄時,需要用到與邏輯。在SQLAlchemy中與邏輯可以有3種表達方式。

以下3條語句查詢結果相同,都是id為3的記錄。

#直接在filter中新增多個條件即表示與邏輯
session.query(Account).filter(Account.title==`Engineer`,Account.salary=3000)

#用關機子and_進行邏輯查詢
from sqlalchemy import and_
session.query(Account).filter(and_(Account.title==`Engineer`,Account.salary=3000))

#通過多個filter的連結表示與邏輯
session.query(Account).filter(Account.title==`Engineer`).filter(Account.salary=3000)

8、或邏輯(or_)

當需要查詢多個條件但只需其中一個條件滿足時,需要用到或邏輯。

#引入或邏輯關鍵字or_
from sqlalchemy import or_

#查詢title是Engineer或者salary為3000的記錄,返回結果為id為1、2、3、4的記錄
session.query(Account).filter(or_(Account.title==`Engineer`,Account.salary=3000))

相關文章