最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python的ORM框架中SQLAlchemy庫的查詢操作的教程

 更新時間:2015年04月25日 15:46:49   投稿:goldensun  
這篇文章主要介紹了Python的ORM框架中SQLAlchemy庫的查詢操作的教程,SQLAlchemy用來操作數(shù)據(jù)庫十分方便,需要的朋友可以參考下

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

前面我們注意到Query對象可以返回可迭代的值(iterator value),然后我們可以通過for in來查詢。不過Query對象的all()、one()以及first()方法將返回非迭代值(non-iterator value),比如說all()返回的是一個列表:

>>> 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()方法限制并僅作為標量返回結果集的第一條記錄:

>>> 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()方法,完整的提取所有的記錄行,并且如果沒有明確的一條記錄行(沒有找到這條記錄)或者結果中存在多條記錄行,將會引發(fā)錯誤異常NoResultFound或者MultipleResultsFound:

>>> 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對象能夠靈活的使用原義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

當然很多人可能會和我感覺一樣,會有些不適應,因為使用ORM就是為了擺脫SQL語句的,沒想到現(xiàn)在又看到SQL的影子了。呵呵,SQLAlchemy也要照顧到使用上的靈活性嘛,畢竟有些查詢語句直接編入要容易得多。

當然綁定參數(shù)也可以用基于字符串的SQL指派,使用冒號來標記替代參數(shù),然后再使用params()方法指定相應的值:

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

>>> 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()中直接使用列名來指派我們想要的列而擺脫映射類的束縛:

>>> 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. 計數(shù) (Counting)

對于Query來說,計數(shù)功能也有個單獨的方法稱為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()方法被用于確定返回的結果集中有多少行,讓我們觀察一下產生的SQL語句,SQLAlchemy先是取出符合條件的所有行集合,然后再通過SELECT count(*)來統(tǒng)計有多少行。當然有點SQL知識的同學可能知道這條語句可以以更精簡的方式寫出來,比如SELECT count(*) FROM table,當然現(xiàn)代版本的SQLAlchemy不會去揣摩這樣的想法。

假使我們要讓查詢語句更加精煉或者要明確要統(tǒng)計的列,我們可以通過表達式func.count()直接使用count函數(shù),比如下面的例子介紹統(tǒng)計并返回每個唯一的用戶名字:

>>> 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')]

對于剛才提到的簡單SELECT count(*) FROM table語句,我們可以通過下面的例子來實現(xiàn):

>>> session.query(func.count('*')).select_from(User).scalar()
SELECT count(?) AS count_1
FROM users
('*',)
 
4

當然如果我們直接統(tǒng)計User的主鍵,上面的語句可以更加簡練,我們可以省去select_from()方法:

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

相關文章

  • python顯示生日是星期幾的方法

    python顯示生日是星期幾的方法

    這篇文章主要介紹了python顯示生日是星期幾的方法,涉及Python使用date模塊操作日期的技巧,需要的朋友可以參考下
    2015-05-05
  • Python實現(xiàn)位圖分割的效果

    Python實現(xiàn)位圖分割的效果

    目前網(wǎng)絡上大多為用C++或者Matlab編寫實現(xiàn)位圖分割,所以本文將使用Python實現(xiàn)位圖分割這一效果,代碼簡單易懂,感興趣的小伙伴可以關注一下
    2021-11-11
  • Python如何實現(xiàn)強制數(shù)據(jù)類型轉換

    Python如何實現(xiàn)強制數(shù)據(jù)類型轉換

    這篇文章主要介紹了Python如何實現(xiàn)強制數(shù)據(jù)類型轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • GitHub 熱門:Python 算法大全,Star 超過 2 萬

    GitHub 熱門:Python 算法大全,Star 超過 2 萬

    4 月 27 日,GitHub 趨勢榜第 3 位是一個用 Python 編碼實現(xiàn)的算法庫,Star 數(shù)早已達到 26000+
    2019-04-04
  • 用Python爬取某乎手機APP數(shù)據(jù)

    用Python爬取某乎手機APP數(shù)據(jù)

    最近爬取的數(shù)據(jù)都是網(wǎng)頁端,今天來教大家如何爬取手機端app數(shù)據(jù)(本文以ios蘋果手機為例,其實安卓跟ios差不多)! 本文將以『某乎』為實戰(zhàn)案例,手把手教你從配置到代碼一步一步的爬取App數(shù)據(jù),需要的朋友可以參考下
    2021-06-06
  • Python pysnmp使用方法及代碼實例

    Python pysnmp使用方法及代碼實例

    這篇文章主要介紹了Python pysnmp使用方法及代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Python如何實現(xiàn)轉換URL詳解

    Python如何實現(xiàn)轉換URL詳解

    這篇文章主要介紹了Python如何實現(xiàn)轉換URL詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • python實現(xiàn)批處理文件

    python實現(xiàn)批處理文件

    這篇文章主要為大家詳細介紹了python實現(xiàn)批處理文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Python Pillow 圖像處理庫詳解(常用Pillow函數(shù)及其參數(shù))

    Python Pillow 圖像處理庫詳解(常用Pillow函數(shù)及其參數(shù))

    Pillow,原名PIL(Python Imaging Library),是一個功能強大的Python圖像處理庫,支持多種格式,提供豐富的圖像操作功能,如旋轉、縮放、顏色轉換等,以及易于使用的API,Pillow支持廣泛的圖像文件格式,并提供圖像過濾、繪制等功能
    2024-09-09
  • python編寫計算器功能

    python編寫計算器功能

    這篇文章主要為大家詳細介紹了python編寫計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評論

荔波县| 崇信县| 东台市| 福贡县| 商水县| 渭源县| 清远市| 青岛市| 密山市| 峨眉山市| 法库县| 五莲县| 乌兰浩特市| 遂昌县| 砚山县| 五指山市| 额敏县| 古蔺县| 顺平县| 三原县| 博罗县| 綦江县| 府谷县| 盘山县| 德令哈市| 康定县| 汝城县| 怀集县| 肥西县| 蒙山县| 合水县| 会东县| 南乐县| 错那县| 柯坪县| 微山县| 绥化市| 辽源市| 麻江县| 河北区| 张家口市|