上一篇文章: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))