Python的ORM框架中SQLAlchemy庫(kù)的查詢操作的教程
1. 返回列表和標(biāo)量(Scalar)
前面我們注意到Query對(duì)象可以返回可迭代的值(iterator value),然后我們可以通過(guò)for in來(lái)查詢。不過(guò)Query對(duì)象的all()、one()以及first()方法將返回非迭代值(non-iterator value),比如說(shuō)all()返回的是一個(gè)列表:
>>> query = session.query(User).\ >>> filter(User.name.like('%ed')).order_by(User.id) >>> query.all() SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users WHERE users.name LIKE ? ORDER BY users.id ('%ed',) [User('ed','Ed Jones', 'f8s7ccs'), User('fred','Fred Flinstone', 'blah')]
first()方法限制并僅作為標(biāo)量返回結(jié)果集的第一條記錄:
>>> query.first() SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users WHERE users.name LIKE ? ORDER BY users.id LIMIT ? OFFSET ? ('%ed', 1, 0) <User('ed','Ed Jones', 'f8s7ccs')>
one()方法,完整的提取所有的記錄行,并且如果沒(méi)有明確的一條記錄行(沒(méi)有找到這條記錄)或者結(jié)果中存在多條記錄行,將會(huì)引發(fā)錯(cuò)誤異常NoResultFound或者M(jìn)ultipleResultsFound:
>>> from sqlalchemy.orm.exc import MultipleResultsFound >>> try: ... user = query.one() ... except MultipleResultsFound, e: ... print e SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users WHERE users.name LIKE ? ORDER BY users.id ('%ed',) Multiple rows were found for one() >>> from sqlalchemy.orm.exc import NoResultFound >>> try: ... user = query.filter(User.id == 99).one() ... except NoResultFound, e: ... print e SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users WHERE users.name LIKE ? AND users.id = ? ORDER BY users.id ('%ed', 99) No row was found for one()
2. 使用原義SQL (Literal SQL)
Query對(duì)象能夠靈活的使用原義SQL查詢字符串作為查詢參數(shù),比如我們之前用過(guò)的filter()和order_by()方法:
>>> for user in session.query(User).\ ... filter("id<224").\ ... order_by("id").all(): ... print user.name SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users WHERE id<224 ORDER BY id () ed wendy mary fred
當(dāng)然很多人可能會(huì)和我感覺(jué)一樣,會(huì)有些不適應(yīng),因?yàn)槭褂肙RM就是為了擺脫SQL語(yǔ)句的,沒(méi)想到現(xiàn)在又看到SQL的影子了。呵呵,SQLAlchemy也要照顧到使用上的靈活性嘛,畢竟有些查詢語(yǔ)句直接編入要容易得多。
當(dāng)然綁定參數(shù)也可以用基于字符串的SQL指派,使用冒號(hào)來(lái)標(biāo)記替代參數(shù),然后再使用params()方法指定相應(yīng)的值:
>>> session.query(User).filter("id<:value and name=:name").\ ... params(value=224, name='fred').order_by(User.id).one() SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users WHERE id<User('fred','Fred Flinstone', 'blah')>
到這里,SQL語(yǔ)句的樣子已經(jīng)初見(jiàn)端倪了,其實(shí)我們可以更極端一點(diǎn),直接使用SQL語(yǔ)句,什么?這樣就失去ORM的價(jià)值了!別急,這里只是介紹一下支持這種用法,當(dāng)然我建議不到萬(wàn)不得已,盡量不要這樣寫,因?yàn)榭赡軙?huì)有兼容的問(wèn)題,畢竟各個(gè)數(shù)據(jù)庫(kù)的SQL方言不一樣。不過(guò)有一點(diǎn)需要注意的是,如果要直接使用原生SQL語(yǔ)句,在被query()所查詢的映射類中,你必須保證語(yǔ)句所指代的列仍然被映射類所管理,比如接下來(lái)的例子:
>>> session.query(User).from_statement( ... "SELECT * FROM users where name=:name").\ ... params(name='ed').all() SELECT * FROM users where name=? ('ed',) [<User('ed','Ed Jones', 'f8s7ccs')>]
我們還可以在query()中直接使用列名來(lái)指派我們想要的列而擺脫映射類的束縛:
>>> session.query("id", "name", "thenumber12").\ ... from_statement("SELECT id, name, 12 as " ... "thenumber12 FROM users where name=:name").\ ... params(name='ed').all() SELECT id, name, 12 as thenumber12 FROM users where name=? ('ed',) [(1, u'ed', 12)]
3. 計(jì)數(shù) (Counting)
對(duì)于Query來(lái)說(shuō),計(jì)數(shù)功能也有個(gè)單獨(dú)的方法稱為count():
>>> session.query(User).filter(User.name.like('%ed')).count() SELECT count(*) AS count_1 FROM (SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users WHERE users.name LIKE ?) AS anon_1 ('%ed',) 2
count()方法被用于確定返回的結(jié)果集中有多少行,讓我們觀察一下產(chǎn)生的SQL語(yǔ)句,SQLAlchemy先是取出符合條件的所有行集合,然后再通過(guò)SELECT count(*)來(lái)統(tǒng)計(jì)有多少行。當(dāng)然有點(diǎn)SQL知識(shí)的同學(xué)可能知道這條語(yǔ)句可以以更精簡(jiǎn)的方式寫出來(lái),比如SELECT count(*) FROM table,當(dāng)然現(xiàn)代版本的SQLAlchemy不會(huì)去揣摩這樣的想法。
假使我們要讓查詢語(yǔ)句更加精煉或者要明確要統(tǒng)計(jì)的列,我們可以通過(guò)表達(dá)式func.count()直接使用count函數(shù),比如下面的例子介紹統(tǒng)計(jì)并返回每個(gè)唯一的用戶名字:
>>> from sqlalchemy import func >>> session.query(func.count(User.name), User.name).group_by(User.name).all() SELECT count(users.name) AS count_1, users.name AS users_name FROM users GROUP BY users.name () [(1, u'ed'), (1, u'fred'), (1, u'mary'), (1, u'wendy')]
對(duì)于剛才提到的簡(jiǎn)單SELECT count(*) FROM table語(yǔ)句,我們可以通過(guò)下面的例子來(lái)實(shí)現(xiàn):
>>> session.query(func.count('*')).select_from(User).scalar() SELECT count(?) AS count_1 FROM users ('*',) 4
當(dāng)然如果我們直接統(tǒng)計(jì)User的主鍵,上面的語(yǔ)句可以更加簡(jiǎn)練,我們可以省去select_from()方法:
>>> session.query(func.count(User.id)).scalar() SELECT count(users.id) AS count_1 FROM users () 4
- Python流行ORM框架sqlalchemy的簡(jiǎn)單使用
- python orm 框架中sqlalchemy用法實(shí)例詳解
- Python流行ORM框架sqlalchemy安裝與使用教程
- 研究Python的ORM框架中的SQLAlchemy庫(kù)的映射關(guān)系
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之?dāng)?shù)據(jù)查詢實(shí)例
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之?dāng)?shù)據(jù)添加和事務(wù)回滾介紹
- Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法
相關(guān)文章
Python自動(dòng)化辦公之Excel數(shù)據(jù)的寫入
這篇文章主要為大家詳細(xì)介紹一下Python中excel的寫入模塊- xlsxwriter,并利用該模塊實(shí)現(xiàn)Excel數(shù)據(jù)的寫入,感興趣的小伙伴可以了解一下2022-05-05python自動(dòng)化測(cè)試selenium操作下拉列表實(shí)現(xiàn)
這篇文章主要為大家介紹了python自動(dòng)化測(cè)試selenium操作下拉列表實(shí)現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11Python利用lxml庫(kù)實(shí)現(xiàn)XML高級(jí)處理詳解
在Python的世界中,lxml是處理XML和HTML的一款強(qiáng)大且易用的庫(kù),本文主要介紹了如何解析、創(chuàng)建、修改XML文檔,如何使用XPath查詢,以及如何解析大型XML文檔,需要的可以參考下2023-08-08用Python實(shí)現(xiàn)QQ游戲大家來(lái)找茬輔助工具
這是一個(gè)用于QQ大家來(lái)找茬(美女找茬)的輔助外掛,開(kāi)發(fā)的原因是看到老爸天天在玩這個(gè)游戲,分?jǐn)?shù)是慘不忍睹的負(fù)4000多。本來(lái)是想寫個(gè)很簡(jiǎn)單的東西,但由于過(guò)程中老爸的多次嘲諷,逼得我不得不盡力完善,最后形成了一個(gè)小小的產(chǎn)品。2014-09-09Python實(shí)現(xiàn)冒泡排序的簡(jiǎn)單應(yīng)用示例
這篇文章主要介紹了Python實(shí)現(xiàn)冒泡排序的簡(jiǎn)單應(yīng)用,結(jié)合實(shí)例形式分析了Python基于冒泡排序?qū)崿F(xiàn)的輸入字符串?dāng)?shù)字排序與運(yùn)算操作,需要的朋友可以參考下2017-12-12Python數(shù)據(jù)結(jié)構(gòu)與算法之字典樹(shù)實(shí)現(xiàn)方法示例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之字典樹(shù)實(shí)現(xiàn)方法,可實(shí)現(xiàn)針對(duì)單詞出現(xiàn)次數(shù)的統(tǒng)計(jì)功能,涉及Python樹(shù)結(jié)構(gòu)的定義、遍歷及統(tǒng)計(jì)等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12