SQLAlchemy的ORM(3)
查找方法:
介紹完過濾條件后匪凉,有一些經(jīng)常用到的查找數(shù)據(jù)的方法也需要解釋一下:
-
all()
:返回一個Python
列表(list
):query = session.query(User).filter(User.name.like('%ed%').order_by(User.id) # 輸出query的類型 print type(query) > <type 'list'> # 調(diào)用all方法 query = query.all() # 輸出query的類型 print type(query) > <class 'sqlalchemy.orm.query.Query'>
-
first()
:返回Query
中的第一個值:user = session.query(User).first() print user > <User(name='ed', fullname='Ed Jones', password='f8s7ccs')>
-
one()
:查找所有行作為一個結(jié)果集啸罢,如果結(jié)果集中只有一條數(shù)據(jù)镀脂,則會把這條數(shù)據(jù)提取出來赞季,如果這個結(jié)果集少于或者多于一條數(shù)據(jù)沈跨,則會拋出異常篮奄。總結(jié)一句話:有且只有一條數(shù)據(jù)的時候才會正常的返回汇陆,否則拋出異常:# 多于一條數(shù)據(jù) user = query.one() > Traceback (most recent call last): > ... > MultipleResultsFound: Multiple rows were found for one() # 少于一條數(shù)據(jù) user = query.filter(User.id == 99).one() > Traceback (most recent call last): > ... > NoResultFound: No row was found for one() # 只有一條數(shù)據(jù) > query(User).filter_by(name='ed').one()
one_or_none()
:跟one()
方法類似怒炸,但是在結(jié)果集中沒有數(shù)據(jù)的時候也不會拋出異常。-
scalar()
:底層調(diào)用one()
方法毡代,并且如果one()
方法沒有拋出異常阅羹,會返回查詢到的第一列的數(shù)據(jù):session.query(User.name,User.fullname).filter_by(name='ed').scalar()
文本SQL:
SQLAlchemy
還提供了使用文本SQL的方式來進行查詢勺疼,這種方式更加的靈活。而文本SQL要裝在一個text()
方法中捏鱼,看以下例子:
from sqlalchemy import text
for user in session.query(User).filter(text("id<244")).order_by(text("id")).all():
print user.name
如果過濾條件比如上例中的244存儲在變量中执庐,這時候就可以通過傳遞參數(shù)的形式進行構(gòu)造:
session.query(User).filter(text("id<:value and name=:name")).params(value=224,name='ed').order_by(User.id)
在文本SQL中的變量前面使用了:
來區(qū)分,然后使用params
方法导梆,指定需要傳入進去的參數(shù)轨淌。另外,使用from_statement
方法可以把過濾的函數(shù)和條件函數(shù)都給去掉看尼,使用純文本的SQL:
sesseion.query(User).from_statement(text("select * from users where name=:name")).params(name='ed').all()
使用from_statement
方法一定要注意递鹉,from_statement
返回的是一個text
里面的查詢語句,一定要記得調(diào)用all()
方法來獲取所有的值藏斩。
計數(shù)(Count):
Query
對象有一個非常方便的方法來計算里面裝了多少數(shù)據(jù):
session.query(User).filter(User.name.like('%ed%')).count()
當然躏结,有時候你想明確的計數(shù),比如要統(tǒng)計users
表中有多少個不同的姓名狰域,那么簡單粗暴的采用以上count
是不行的媳拴,因為姓名有可能會重復,但是處于兩條不同的數(shù)據(jù)上兆览,如果在原生數(shù)據(jù)庫中屈溉,可以使用distinct
關(guān)鍵字,那么在SQLAlchemy
中抬探,可以通過func.count()
方法來實現(xiàn):
from sqlalchemy import func
session.query(func.count(User.name),User.name).group_by(User.name).all()
# 輸出的結(jié)果
> [(1, u'ed'), (1, u'fred'), (1, u'mary'), (1, u'wendy')]
另外子巾,如果想實現(xiàn)select count(*) from users
,可以通過以下方式來實現(xiàn):
session.query(func.count(*)).select_from(User).scalar()
當然驶睦,如果指定了要查找的表的字段砰左,可以省略select_from()
方法:
session.query(func.count(User.id)).scalar()