>>query=session.query(User).\>>>filter(User.name.like('%ed')).order_by(User.id)>" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python的ORM框架中SQLAlchemy庫(kù)的查詢操作的教程

系統(tǒng) 1637 0

1. 返回列表和標(biāo)量(Scalar)

前面我們注意到Query對(duì)象可以返回可迭代的值(iterator value),然后我們可以通過for in來查詢。不過Query對(duì)象的all()、one()以及first()方法將返回非迭代值(non-iterator value),比如說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)
 

            
            
          

one()方法,完整的提取所有的記錄行,并且如果沒有明確的一條記錄行(沒有找到這條記錄)或者結(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ù),比如我們之前用過的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ì)和我感覺一樣,會(huì)有些不適應(yīng),因?yàn)槭褂肙RM就是為了擺脫SQL語句的,沒想到現(xiàn)在又看到SQL的影子了。呵呵,SQLAlchemy也要照顧到使用上的靈活性嘛,畢竟有些查詢語句直接編入要容易得多。

當(dāng)然綁定參數(shù)也可以用基于字符串的SQL指派,使用冒號(hào)來標(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
            
            
          

到這里,SQL語句的樣子已經(jīng)初見端倪了,其實(shí)我們可以更極端一點(diǎn),直接使用SQL語句,什么?這樣就失去ORM的價(jià)值了!別急,這里只是介紹一下支持這種用法,當(dāng)然我建議不到萬不得已,盡量不要這樣寫,因?yàn)榭赡軙?huì)有兼容的問題,畢竟各個(gè)數(shù)據(jù)庫(kù)的SQL方言不一樣。不過有一點(diǎn)需要注意的是,如果要直接使用原生SQL語句,在被query()所查詢的映射類中,你必須保證語句所指代的列仍然被映射類所管理,比如接下來的例子:

            
>>> session.query(User).from_statement(
...           "SELECT * FROM users where name=:name").\
...           params(name='ed').all()
SELECT * FROM users where name=?
('ed',)
 
[
            
              ]


            
          

我們還可以在query()中直接使用列名來指派我們想要的列而擺脫映射類的束縛:

            
>>> 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來說,計(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語句,SQLAlchemy先是取出符合條件的所有行集合,然后再通過SELECT count(*)來統(tǒng)計(jì)有多少行。當(dāng)然有點(diǎn)SQL知識(shí)的同學(xué)可能知道這條語句可以以更精簡(jiǎn)的方式寫出來,比如SELECT count(*) FROM table,當(dāng)然現(xiàn)代版本的SQLAlchemy不會(huì)去揣摩這樣的想法。

假使我們要讓查詢語句更加精煉或者要明確要統(tǒng)計(jì)的列,我們可以通過表達(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語句,我們可以通過下面的例子來實(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的主鍵,上面的語句可以更加簡(jiǎn)練,我們可以省去select_from()方法:

            
>>> session.query(func.count(User.id)).scalar() 
SELECT count(users.id) AS count_1
FROM users
()
 
4


          


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 精品久久久久久久久久久久久久 | 亚洲国产精品久久久久666 | 青青草成人免费视频在线 | 大片毛片| 黄在线免费看 | 欧美特黄aaaaaa | 国产成人精品一区二区三区电影 | 欧美男女网站 | 久久久www成人免费精品 | 欧美日韩亚洲精品国产色 | 国产精品999 | 日本久久综合网 | 日本加勒比视频在线观看 | 国产精品综合色区在线观看 | 中文字幕在线第一页 | 婷婷丁香社区 | 精品伊人久久久大香线蕉欧美 | 国产精品亚洲天堂 | 国产人成精品综合欧美成人 | 黄色在线观看国产 | 国产精品免费一级在线观看 | av免费在线免费观看 | 色网在线 | 波多野结衣在线网址 | 日本一级毛片不卡免费 | 日韩在线网址 | 自偷自拍三级全三级视频 | 午夜在线视频一区二区三区 | 欧美一级美国一级 | 成人免费视频观看视频 | 色婷婷成人做爰A片免费看网站 | 一级特黄aaa大片大全 | 日韩中文在线 | 色呦呦免费观看 | 一区二区三区四区国产 | 蜜桃五月天 | 精品免费视频 | 色综合久久天天综合网 | 夜夜骚 | 日韩在线精品 | 久久55|