3.4 SQLAlchemy的查詢

SQLAlchemy的ORM(3)

查找方法:

介紹完過濾條件后匪凉,有一些經(jīng)常用到的查找數(shù)據(jù)的方法也需要解釋一下:

  1. 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'>
    
  2. first():返回Query中的第一個值:

    user = session.query(User).first()
    print user
    > <User(name='ed', fullname='Ed Jones', password='f8s7ccs')>
    
  3. 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()
    
  4. one_or_none():跟one()方法類似怒炸,但是在結(jié)果集中沒有數(shù)據(jù)的時候也不會拋出異常。

  5. 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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匿醒,一起剝皮案震驚了整個濱河市场航,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌廉羔,老刑警劉巖溉痢,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異憋他,居然都是意外死亡孩饼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門竹挡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镀娶,“玉大人,你說我怎么就攤上這事揪罕√萋耄” “怎么了宝泵?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵讲婚,是天一觀的道長洛心。 經(jīng)常有香客問我,道長梗醇,這世上最難降的妖魔是什么鳄抒? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任闯捎,我火速辦了婚禮,結(jié)果婚禮上许溅,老公的妹妹穿的比我還像新娘瓤鼻。我一直安慰自己,他們只是感情好贤重,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布娱仔。 她就那樣靜靜地躺著,像睡著了一般游桩。 火紅的嫁衣襯著肌膚如雪牲迫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天借卧,我揣著相機與錄音盹憎,去河邊找鬼。 笑死铐刘,一個胖子當著我的面吹牛陪每,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镰吵,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼檩禾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疤祭?” 一聲冷哼從身側(cè)響起盼产,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勺馆,沒想到半個月后戏售,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡草穆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年灌灾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悲柱。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡锋喜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豌鸡,到底是詐尸還是另有隱情嘿般,我是刑警寧澤轴总,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站博个,受9級特大地震影響怀樟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盆佣,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一往堡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧共耍,春花似錦虑灰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至字旭,卻和暖如春对湃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遗淳。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工拍柒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屈暗。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓拆讯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親养叛。 傳聞我的和親對象是個殘疾皇子种呐,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361