Python ORM架構SQLAlchemy學習筆記之資料查詢執行個體

來源:互聯網
上載者:User
前期我們做了充足的準備工作,現在該是關鍵內容之一查詢了,當然前面的文章中或多或少的穿插了些有關查詢的東西,比如一個查詢(Query)對象就是通過Session會話的query()方法擷取的,需要注意的是這個方法的參數數目是可變的,也就是說我們可以傳入任意多的參數數目,參數的類型可以是任意的類組合或者是類的名稱,接下來我們的例子就說明了這一點,我們讓Query對象載入了User執行個體。
複製代碼 代碼如下:


>>> 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

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

假設我們僅僅只需要“使用者名稱”和“使用者全名”,對於對象執行個體的其他屬性不感興趣的話,也可以直接查詢它們(類的屬性名稱),當然這裡的前提是這個類必須是ORM映射的,無論何時,任意數目的類實體或者基於列的實體均可以作為query()方法的參數,當然最終Query對象會返回元群組類型。
複製代碼 代碼如下:


>>> 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對象,屬性名稱歸屬性名稱,類型名稱歸類型名稱,比如下面的例子:
複製代碼 代碼如下:


>>> 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
()

ed
wendy
mary
fred


當然你也可以搞點個人化,比如通過label()方法改變單獨的列運算式名稱,當然這個方法只有在映射到實體表的列元素對象(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


之前我們看到查詢對象執行個體必須用到實體類的全名(User),假設我們要多次使用這個實體類名作為查詢對象(比如表串連操作)query()的參數,則我們可以給它取個“別名”,然後就可以通過別名來傳入參數:
複製代碼 代碼如下:


>>> 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
()





學過MySQL等這類資料庫的同學可能知道LIMIT和OFFSET這兩個SQL操作,這個能夠很方便的協助我們控制記錄的數目和位置,常常被用於資料分頁操作,當然這類操作SQLAlchemy的Query對象已經幫我們想好了,而且很簡單的可以通過Python數組分區來實現,這個操作常常和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)



假如我們需要篩選過濾特定結果,則可以使用filter_by()方法,這個方法使用關鍵詞參數:
複製代碼 代碼如下:


>>> 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()同樣能達到目的,不過需要注意的是其使用了更加靈活的類似SQL語句的運算式結構,這意味著你可以在其內部使用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相等的才篩選。

當然強大的Query對象有個很有用的特性,那就是它是可以串聯的,意味著Query對象的每一步操作將會返回一個Query對象,你可以將相同的方法串聯到一起形成運算式結構,假如說我們要查詢使用者名稱為”ed”並且全名為”Ed Jones”的使用者,你可以直接串聯調用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')


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

1. 相等
複製代碼 代碼如下:

query.filter(User.name == 'ed')


2. 不等
複製代碼 代碼如下:

query.filter(User.name != 'ed')


3. LIKE
複製代碼 代碼如下:

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


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
複製代碼 代碼如下:

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


6. IS NULL
複製代碼 代碼如下:

filter(User.name == None)


7. IS NOT NULL
複製代碼 代碼如下:

filter(User.name != None)


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()參數內容由資料庫後台指定。(註:原文是“The contents of the match parameter are database backend specific.”,不太明白這個操作的意思)

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

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.