前期我們做了充足的準(zhǔn)備工作,現(xiàn)在該是關(guān)鍵內(nèi)容之一查詢了,當(dāng)然前面的文章中或多或少的穿插了些有關(guān)查詢的東西,比如一個(gè)查詢(Query)對(duì)象就是通過(guò)Session會(huì)話的query()方法獲取的,需要注意的是這個(gè)方法的參數(shù)數(shù)目是可變的,也就是說(shuō)我們可以傳入任意多的參數(shù)數(shù)目,參數(shù)的類型可以是任意的類組合或者是類的名稱,接下來(lái)我們的例子就說(shuō)明了這一點(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)然通過(guò)這個(gè)例子我們得到Query對(duì)象返回的是一組可迭代的User實(shí)例表,然后我們通過(guò)for in語(yǔ)句訪問(wèn),比如說(shuō)這里可以依次輸出“用戶名”instance.name和“用戶全名”instance.fullname。大家可能還注意到后面有個(gè).order_by(User.id),這個(gè)和SQL語(yǔ)句一樣的,指示結(jié)果集按User.id所映射的表列進(jìn)行排序。
假設(shè)我們僅僅只需要“用戶名”和“用戶全名”,對(duì)于對(duì)象實(shí)例的其他屬性不感興趣的話,也可以直接查詢它們(類的屬性名稱),當(dāng)然這里的前提是這個(gè)類必須是ORM映射的,無(wú)論何時(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è)性化,比如通過(guò)label()方法改變單獨(dú)的列表達(dá)式名稱,當(dāng)然這個(gè)方法只有在映射到實(shí)體表的列元素對(duì)象(ColumnElement-derived)中存在(比如 User.name):
新聞熱點(diǎn)
疑難解答
圖片精選