2009-07-28 7 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の上のAPI(V.5)を見てではなく、混乱していました。 'results'の 'result'は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

最初のスニペットは私が最初に思いついたものです。 2番目のスニペットでは、 "ValueError:アンパックする値が多すぎます" - hrm? –

+0

余分な列を指定しませんでした。もう一度やり直してみましょう –

+0

TypeError:select()は最大2つの引数をとります(4が指定されています) >> s = users_table.select(users_table.c.user_name、users_table.c.user_location、users_table.c.user_name == username) –

14

A SQLAlchemyのRowProxyオブジェクトが辞書のような方法を持っています - 名前だけ(例えば、ヘッダ行としてそれらを表示し、対応する値に対して.values()を使用するか、またはそれぞれを使用して取得するために、.items()すべての名前/値のペアを取得するために.keys()RowProxyオブジェクトなどにインデックスするためのキーです - 平易なディクテーションではなく "スマートオブジェクト"であるため、あなたに不都合なことはありません。

関連する問題