2009-07-28 75 views
9

我想要做一些相對簡單的事情,吐出列名和相應的列值,並且可能會過濾掉某些列,以免它們顯示出來。SQLAlchemy:對結果進行操作

這是我嘗試(當然的初始連接之後):

metadata = MetaData(engine) 

users_table = Table('fusion_users', metadata, autoload=True) 

s = users_table.select(users_table.c.user_name == username) 
results = s.execute() 

if results.rowcount != 1: 
    return 'Sorry, user not found.' 
else: 
    for result in results: 
    for x, y in result.items() 
     print x, y 

我看着SQLAlchemy的(第5節)的API,但很是困惑。 '結果'中的'結果'是一個RowProxy,但我不認爲它會爲.items()調用返回正確的對象。

比方說,我的表結構是這樣:

user_id user_name user_password user_country 
0   john   a9fu93f39uf  usa 

我想過濾和指定列名,以顯示(我不想明明顯示USER_PASSWORD) - 我怎樣才能做到這一點?

回答

10

您可以立即使用results作爲迭代器。

results = s.execute() 

for row in results: 
    print row 

選擇特定的列被做了以下的方法:

from sqlalchemy.sql import select 

s = select([users_table.c.user_name, users_table.c.user_country], users_table.c.user_name == username) 

for user_name, user_country in s.execute(): 
    print user_name, user_country 

要打印的列名額外的價值,你已經在你的問題應該是最好做的方式,因爲RowProxy真的不算什麼不僅僅是一個有序的字典。

IMO SqlAlchemy的API文檔對於學習如何使用它並不是很有幫助。我建議你閱讀SQL Expression Language Tutorial。它包含有關使用SqlAlchemy進行基本查詢的最重要信息。

+0

第一個片段是我最初想到的,並返回了一切。 對於第二個片段,我得到「ValueError:太多的值來解壓縮」 - hrm? – 2009-07-28 07:49:04

14

甲SQLAlchemy的RowProxy對象具有類似字典的方法 - .items()獲得所有的名稱/值對,.keys()得到公正的名稱(例如,以顯示它們作爲一個標題行,然後使用.values()爲相應的值,或使用各鍵指向RowProxy對象,等等 - 所以它是一個「聰明的對象」,而不是一個普通的字典,不應該給你帶來不便。