Python ORM框架SQLAlchemy學(xué)習(xí)筆記之?dāng)?shù)據(jù)查詢實(shí)例
前期我們做了充足的準(zhǔn)備工作,現(xiàn)在該是關(guān)鍵內(nèi)容之一查詢了,當(dāng)然前面的文章中或多或少的穿插了些有關(guān)查詢的東西,比如一個(gè)查詢(Query)對(duì)象就是通過Session會(huì)話的query()方法獲取的,需要注意的是這個(gè)方法的參數(shù)數(shù)目是可變的,也就是說我們可以傳入任意多的參數(shù)數(shù)目,參數(shù)的類型可以是任意的類組合或者是類的名稱,接下來我們的例子就說明了這一點(diǎn),我們讓Query對(duì)象加載了User實(shí)例。
>>> 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)然通過這個(gè)例子我們得到Query對(duì)象返回的是一組可迭代的User實(shí)例表,然后我們通過for in語句訪問,比如說這里可以依次輸出“用戶名”instance.name和“用戶全名”instance.fullname。大家可能還注意到后面有個(gè).order_by(User.id),這個(gè)和SQL語句一樣的,指示結(jié)果集按User.id所映射的表列進(jìn)行排序。
假設(shè)我們僅僅只需要“用戶名”和“用戶全名”,對(duì)于對(duì)象實(shí)例的其他屬性不感興趣的話,也可以直接查詢它們(類的屬性名稱),當(dāng)然這里的前提是這個(gè)類必須是ORM映射的,無論何時(shí),任意數(shù)目的類實(shí)體或者基于列的實(shí)體均可以作為query()方法的參數(shù),當(dāng)然最終Query對(duì)象會(huì)返回元組類型。
>>> 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對(duì)象,屬性名稱歸屬性名稱,類型名稱歸類型名稱,比如下面的例子:
>>> 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)個(gè)性化,比如通過label()方法改變單獨(dú)的列表達(dá)式名稱,當(dāng)然這個(gè)方法只有在映射到實(shí)體表的列元素對(duì)象(ColumnElement-derived)中存在(比如 User.name):
>>> 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
之前我們看到查詢對(duì)象實(shí)例必須用到實(shí)體類的全名(User),假設(shè)我們要多次使用這個(gè)實(shí)體類名作為查詢對(duì)象(比如表連接操作)query()的參數(shù),則我們可以給它取個(gè)“別名”,然后就可以通過別名來傳入?yún)?shù):
>>> 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這兩個(gè)SQL操作,這個(gè)能夠很方便的幫助我們控制記錄的數(shù)目和位置,常常被用于數(shù)據(jù)分頁操作,當(dāng)然這類操作SQLAlchemy的Query對(duì)象已經(jīng)幫我們想好了,而且很簡(jiǎn)單的可以通過Python數(shù)組分片來實(shí)現(xiàn),這個(gè)操作常常和ORDER BY一起使用:
>>> 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()方法,這個(gè)方法使用關(guān)鍵詞參數(shù):
>>> 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自身的操作符,比如比較操作:
>>> 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對(duì)象有個(gè)很有用的特性,那就是它是可以串聯(lián)的,意味著Query對(duì)象的每一步操作將會(huì)返回一個(gè)Query對(duì)象,你可以將相同的方法串聯(lián)到一起形成表達(dá)式結(jié)構(gòu),假如說我們要查詢用戶名為”ed”并且全名為”Ed Jones”的用戶,你可以直接串聯(lián)調(diào)用filter()兩次,表示SQL語句里的AND連接:
>>> 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. 相等
2. 不等
3. LIKE
4. IN
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
6. IS NULL
7. IS NOT NULL
8. AND
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
from sqlalchemy import or_
filter(or_(User.name == 'ed', User.name == 'wendy'))
10. 匹配
query.filter(User.name.match('wendy'))
match()參數(shù)內(nèi)容由數(shù)據(jù)庫后臺(tái)指定。(注:原文是“The contents of the match parameter are database backend specific.”,不太明白這個(gè)操作的意思)
好了,今天就介紹這么多,基本上都是蹩腳的翻譯,希望對(duì)大家能夠幫助
相關(guān)文章
Python庫Cerberus數(shù)據(jù)驗(yàn)證如何保證系統(tǒng)安全性正確性實(shí)例分析
本文帶大家探索?Cerberus?庫,看看它是如何幫助我們?cè)陂_發(fā)過程中保障數(shù)據(jù)的安全性和完整性的,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
python抓取京東商城手機(jī)列表url實(shí)例代碼
python抓取京東商城手機(jī)列表url實(shí)例分享,大家參考使用吧2013-12-12
python列表插入append(), extend(), insert()用法詳解
在本篇文章里小編給大家整理了關(guān)于python列表插入append(), extend(), insert()用法以及相關(guān)知識(shí)點(diǎn),有需要的朋友們參考下。2019-09-09
使用OpenCV實(shí)現(xiàn)仿射變換—縮放功能
這篇文章主要介紹了使用OpenCV實(shí)現(xiàn)仿射變換—縮放功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
TensorFlow和Numpy矩陣操作中axis理解及axis=-1的解釋
在調(diào)用numpy庫中的concatenate()時(shí),有遇到axis=-1/1/0的情況,下面這篇文章主要給大家介紹了關(guān)于TensorFlow和Numpy矩陣操作中axis理解及axis=-1解釋的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
python 操作mysql數(shù)據(jù)中fetchone()和fetchall()方式
這篇文章主要介紹了python 操作mysql數(shù)據(jù)中fetchone()和fetchall()方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python文件操作JSON CSV TSV Excel和Pickle文件序列化
這篇文章主要為大家介紹了Python文件操作之JSON、CSV、TSV、Excel和Pickle文件序列化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
使用Python編寫Linux系統(tǒng)守護(hù)進(jìn)程實(shí)例
這篇文章主要介紹了使用Python編寫Linux系統(tǒng)守護(hù)進(jìn)程實(shí)例,本文先是講解了什么是守護(hù)進(jìn)程,然后給出了一個(gè)Python語言的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2015-02-02

