2009-07-28 10 views
9

Ich versuche, etwas relativ einfaches zu tun, spucke die Spaltennamen und die entsprechenden Spaltenwerte aus und filtere möglicherweise einige Spalten aus, damit sie nicht angezeigt werden.SQLAlchemy: Nach Ergebnissen arbeiten

Dies ist, was ich (nach der ersten Verbindung natürlich) versucht:

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 

schaute ich auf die API auf SQLAlchemy (V.5), sondern eher verwirrt. Mein 'Ergebnis' in 'Ergebnissen' ist ein RowProxy, aber ich glaube nicht, dass es das richtige Objekt für den Aufruf von .items() zurückgibt.

Lassen Sie uns meine Tabellenstruktur sagen ist so:

user_id user_name user_password user_country 
0   john   a9fu93f39uf  usa 

Ich möchte filtern und die Spaltennamen angeben, um zu zeigen, (i die user_password offensichtlich nicht wollen, um zeigen) - wie kann ich das erreichen?

Antwort

10

Sie können results sofort als Iterator verwenden.

results = s.execute() 

for row in results: 
    print row 

bestimmte Spalten auswählen wird die folgende Weise:

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 

Um die Spaltennamen zusätzlich zu den Werten zu drucken, wie Sie es in Ihrer Frage getan haben, sollte die beste sein, weil RowProxy wirklich nichts mehr als ein bestelltes Wörterbuch.

IMO die API-Dokumentation für SqlAlchemy ist nicht wirklich hilfreich zu lernen, wie man es benutzt. Ich würde vorschlagen, dass Sie die SQL Expression Language Tutorial lesen. Es enthält die wichtigsten Informationen über grundlegende Abfragen mit SqlAlchemy.

+0

Der erste Ausschnitt ist, was ich anfing und kehrte alles zurück. Für das zweite Snippet bekomme ich "ValueError: zu viele Werte zum Entpacken" - hrm? –

+0

Ah, ich habe die zusätzlichen Spalten nicht angegeben. Versuchen wir es noch einmal. –

+0

TypeError: select() benötigt höchstens 2 Argumente (4 gegeben) >> s = users_table.select (users_table.c.user_name, users_table.c.user_location, users_table.c.user_name == username) –

14

A SQLAlchemy RowProxy Objekt hat dict artige Methoden - .items() alle Namen/Wert-Paare zu erhalten, .keys() erhalten nur die Namen (zB sie als Kopfzeile angezeigt werden, dann .values() für die entsprechenden Werte verwenden oder verwenden jeweils Schlüssel zum Indexieren in das RowProxy Objekt, usw., so dass es ein "intelligentes Objekt" anstatt ein einfaches Diktat ist, sollte Sie nicht übermäßig stören.

Verwandte Themen