欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python ORM框架SQLAlchemy學(xué)習(xí)筆記之?dāng)?shù)據(jù)查詢實例

 更新時間:2014年06月10日 11:03:14   作者:  
這篇文章主要介紹了Python ORM框架SQLAlchemy學(xué)習(xí)筆記之?dāng)?shù)據(jù)查詢實例,需要的朋友可以參考下

前期我們做了充足的準(zhǔn)備工作,現(xiàn)在該是關(guān)鍵內(nèi)容之一查詢了,當(dāng)然前面的文章中或多或少的穿插了些有關(guān)查詢的東西,比如一個查詢(Query)對象就是通過Session會話的query()方法獲取的,需要注意的是這個方法的參數(shù)數(shù)目是可變的,也就是說我們可以傳入任意多的參數(shù)數(shù)目,參數(shù)的類型可以是任意的類組合或者是類的名稱,接下來我們的例子就說明了這一點(diǎn),我們讓Query對象加載了User實例。

復(fù)制代碼 代碼如下:

>>> for instance in session.query(User).order_by(User.id):
...     print instance.name, instance.fullname
SELECT users.id AS users_id,
        users.name AS users_name,
        users.fullname AS users_fullname,
        users.password AS users_password
FROM users ORDER BY users.id
()

ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flinstone

當(dāng)然通過這個例子我們得到Query對象返回的是一組可迭代的User實例表,然后我們通過for in語句訪問,比如說這里可以依次輸出“用戶名”instance.name和“用戶全名”instance.fullname。大家可能還注意到后面有個.order_by(User.id),這個和SQL語句一樣的,指示結(jié)果集按User.id所映射的表列進(jìn)行排序。

假設(shè)我們僅僅只需要“用戶名”和“用戶全名”,對于對象實例的其他屬性不感興趣的話,也可以直接查詢它們(類的屬性名稱),當(dāng)然這里的前提是這個類必須是ORM映射的,無論何時,任意數(shù)目的類實體或者基于列的實體均可以作為query()方法的參數(shù),當(dāng)然最終Query對象會返回元組類型。

復(fù)制代碼 代碼如下:

>>> for name, fullname in session.query(User.name, User.fullname):
...     print name, fullname
SELECT users.name AS users_name,
        users.fullname AS users_fullname
FROM users
()

ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flinstone

返回的元組類型也可以被看作是普通的Python對象,屬性名稱歸屬性名稱,類型名稱歸類型名稱,比如下面的例子:
復(fù)制代碼 代碼如下:

>>> for row in session.query(User, User.name).all():
...    print row.User, row.name
SELECT users.id AS users_id,
        users.name AS users_name,
        users.fullname AS users_fullname,
        users.password AS users_password
FROM users
()

<User('ed','Ed Jones', 'f8s7ccs')> ed
<User('wendy','Wendy Williams', 'foobar')> wendy
<User('mary','Mary Contrary', 'xxg527')> mary
<User('fred','Fred Flinstone', 'blah')> fred

當(dāng)然你也可以搞點(diǎn)個性化,比如通過label()方法改變單獨(dú)的列表達(dá)式名稱,當(dāng)然這個方法只有在映射到實體表的列元素對象(ColumnElement-derived)中存在(比如 User.name):
復(fù)制代碼 代碼如下:

>>> for row in session.query(User.name.label('name_label')).all():
...    print(row.name_label)
SELECT users.name AS name_label
FROM users
()

ed
wendy
mary
fred

之前我們看到查詢對象實例必須用到實體類的全名(User),假設(shè)我們要多次使用這個實體類名作為查詢對象(比如表連接操作)query()的參數(shù),則我們可以給它取個“別名”,然后就可以通過別名來傳入?yún)?shù):
復(fù)制代碼 代碼如下:

>>> from sqlalchemy.orm import aliased
>>> user_alias = aliased(User, name='user_alias')

>>> for row in session.query(user_alias, user_alias.name).all():
...    print row.user_alias
SELECT user_alias.id AS user_alias_id,
        user_alias.name AS user_alias_name,
        user_alias.fullname AS user_alias_fullname,
        user_alias.password AS user_alias_password
FROM users AS user_alias
()

<User('ed','Ed Jones', 'f8s7ccs')>
<User('wendy','Wendy Williams', 'foobar')>
<User('mary','Mary Contrary', 'xxg527')>
<User('fred','Fred Flinstone', 'blah')>

學(xué)過MySQL等這類數(shù)據(jù)庫的同學(xué)可能知道LIMIT和OFFSET這兩個SQL操作,這個能夠很方便的幫助我們控制記錄的數(shù)目和位置,常常被用于數(shù)據(jù)分頁操作,當(dāng)然這類操作SQLAlchemy的Query對象已經(jīng)幫我們想好了,而且很簡單的可以通過Python數(shù)組分片來實現(xiàn),這個操作常常和ORDER BY一起使用:
復(fù)制代碼 代碼如下:

>>> for u in session.query(User).order_by(User.id)[1:3]:
...    print u
SELECT users.id AS users_id,
        users.name AS users_name,
        users.fullname AS users_fullname,
        users.password AS users_password
FROM users ORDER BY users.id
LIMIT ? OFFSET ?
(2, 1)

<User('wendy','Wendy Williams', 'foobar')>
<User('mary','Mary Contrary', 'xxg527')>

假如我們需要篩選過濾特定結(jié)果,則可以使用filter_by()方法,這個方法使用關(guān)鍵詞參數(shù):
復(fù)制代碼 代碼如下:

>>> for name, in session.query(User.name).\
...             filter_by(fullname='Ed Jones'):
...    print name
SELECT users.name AS users_name FROM users
WHERE users.fullname = ?
('Ed Jones',)

ed

或者使用filter()同樣能達(dá)到目的,不過需要注意的是其使用了更加靈活的類似SQL語句的表達(dá)式結(jié)構(gòu),這意味著你可以在其內(nèi)部使用Python自身的操作符,比如比較操作:
復(fù)制代碼 代碼如下:

>>> for name, in session.query(User.name).\
...             filter(User.fullname=='Ed Jones'):
...    print name
SELECT users.name AS users_name FROM users
WHERE users.fullname = ?
('Ed Jones',)

ed

注意這里的User.fullname=='Ed Jones',比較操作與Ed Jones相等的才篩選。

當(dāng)然強(qiáng)大的Query對象有個很有用的特性,那就是它是可以串聯(lián)的,意味著Query對象的每一步操作將會返回一個Query對象,你可以將相同的方法串聯(lián)到一起形成表達(dá)式結(jié)構(gòu),假如說我們要查詢用戶名為”ed”并且全名為”Ed Jones”的用戶,你可以直接串聯(lián)調(diào)用filter()兩次,表示SQL語句里的AND連接:

復(fù)制代碼 代碼如下:

>>> for user in session.query(User).\
...          filter(User.name=='ed').\
...          filter(User.fullname=='Ed Jones'):
...    print user
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 = ? AND users.fullname = ?
('ed', 'Ed Jones')

<User('ed','Ed Jones', 'f8s7ccs')>

下面列舉一些使用filter()常見的篩選過濾操作:

1. 相等

復(fù)制代碼 代碼如下:
query.filter(User.name == 'ed')

2. 不等
復(fù)制代碼 代碼如下:
query.filter(User.name != 'ed')

3. LIKE
復(fù)制代碼 代碼如下:
query.filter(User.name.like('%ed%'))

4. IN
復(fù)制代碼 代碼如下:

query.filter(User.name.in_(['ed', 'wendy', 'jack']))

# works with query objects too:

query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%ed%'))))

5. NOT IN
復(fù)制代碼 代碼如下:
query.filter(~User.name.in_(['ed', 'wendy', 'jack']))

6. IS NULL
復(fù)制代碼 代碼如下:
filter(User.name == None)

7. IS NOT NULL
復(fù)制代碼 代碼如下:
filter(User.name != None)

8. AND
復(fù)制代碼 代碼如下:

from sqlalchemy import and_
filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))

# or call filter()/filter_by() multiple times
filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')

9. OR
復(fù)制代碼 代碼如下:

from sqlalchemy import or_
filter(or_(User.name == 'ed', User.name == 'wendy'))

10. 匹配
復(fù)制代碼 代碼如下:

query.filter(User.name.match('wendy'))

match()參數(shù)內(nèi)容由數(shù)據(jù)庫后臺指定。(注:原文是“The contents of the match parameter are database backend specific.”,不太明白這個操作的意思)

好了,今天就介紹這么多,基本上都是蹩腳的翻譯,希望對大家能夠幫助

相關(guān)文章

  • Python識別二維碼的兩種方法詳解

    Python識別二維碼的兩種方法詳解

    在學(xué)習(xí)Python處理二維碼的過程中,我們看到的大多是“用python生成酷炫二維碼”、“用Python制作動圖二維碼”之類的文章。而關(guān)于使用Python批量識別二維碼的教程,并不多見。本文就為大家總結(jié)了Python識別二維碼的兩種方法,感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • 利用Python網(wǎng)絡(luò)爬蟲爬取各大音樂評論的代碼

    利用Python網(wǎng)絡(luò)爬蟲爬取各大音樂評論的代碼

    這篇文章主要介紹了如何用Python網(wǎng)絡(luò)爬蟲爬取網(wǎng)易云音樂評論,文章用代碼詳細(xì)的示范了如何爬取網(wǎng)易云音樂評論,對正在學(xué)習(xí)的小伙伴有參考價值,需要的朋友可以參考下
    2021-04-04
  • 使用fiddler抓包工具Python requests報錯:ValueError: check_hostname requires server_hostname的解決

    使用fiddler抓包工具Python requests報錯:ValueError: check_h

    這篇文章主要介紹了使用fiddler抓包工具Python requests報錯:ValueError: check_hostname requires server_hostname的解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • python列表的特點(diǎn)分析

    python列表的特點(diǎn)分析

    在本篇文章里小編個大家整理的是一篇關(guān)于python列表的特點(diǎn)分析內(nèi)容總結(jié),有需要的朋友們可以學(xué)習(xí)下。
    2021-08-08
  • Python實現(xiàn)電視里的5毛特效實例代碼詳解

    Python實現(xiàn)電視里的5毛特效實例代碼詳解

    這篇文章主要介紹了Python實現(xiàn)了電視里的5毛特效,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽

    pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽

    這篇文章主要介紹了pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • python文件絕對路徑寫法介紹(windows)

    python文件絕對路徑寫法介紹(windows)

    今天小編就為大家分享一篇python文件絕對路徑寫法介紹(windows),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python特性之列表推導(dǎo)式和生成器表達(dá)式詳解

    Python特性之列表推導(dǎo)式和生成器表達(dá)式詳解

    這篇文章主要介紹了python語言的兩個非常有用的特性:列表推導(dǎo)式和生成器表達(dá)式,但是它們之間也有一些重要的區(qū)別,我們一起來看看吧
    2023-08-08
  • python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀

    python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀

    這篇文章主要介紹了python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python自定義時鐘類、定時任務(wù)類

    python自定義時鐘類、定時任務(wù)類

    這篇文章主要為大家詳細(xì)介紹了Python自定義時鐘類、定時任務(wù)類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評論