2009-07-28 18 views
9

Sto provando a fare qualcosa di relativamente semplice, sputare i nomi delle colonne e i rispettivi valori di colonna, ed eventualmente filtrare alcune colonne in modo che non vengano mostrate.SQLAlchemy: funzionamento sui risultati

Questo è quello che ho cercato (dopo la connessione iniziale ovviamente):

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 

Ho guardato le API su SQLAlchemy (v.5), ma era piuttosto confusa. il mio 'risultato' in 'risultati' è un RowProxy, ma non penso che restituisca l'oggetto giusto per l'invocazione .items().

Diciamo che la mia struttura della tabella è così:

user_id user_name user_password user_country 
0   john   a9fu93f39uf  usa 

voglio filtrare e specificare i nomi delle colonne da visualizzare (non voglio mostrare l'user_password ovviamente) - come posso fare questo?

risposta

10

È possibile utilizzare immediatamente results come iteratore.

results = s.execute() 

for row in results: 
    print row 

Selezione colonne specifiche avviene nel seguente modo:

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 

Per stampare i nomi delle colonne aggiuntive per i valori che il modo in cui l'avete fatto nella tua domanda dovrebbe essere il migliore perché RowProxy è davvero nulla più di un dizionario ordinato.

IMO la documentazione API per SqlAlchemy non è davvero utile per imparare come usarlo. Ti suggerisco di leggere lo SQL Expression Language Tutorial. Contiene le informazioni più vitali sulle query di base con SqlAlchemy.

+0

Il primo frammento è quello che inizialmente ho trovato e restituito tutto. Per il secondo snippet ottengo "ValoreErrore: troppi valori per decomprimere" - hrm? –

+0

Ah, non ho specificato le colonne aggiuntive. Proviamo di nuovo –

+0

TypeError: select() richiede al massimo 2 argomenti (4 dati) >> s = users_table.select (users_table.c.user_name, users_table.c.user_location, users_table.c.user_name == username) –

14

Uno SQLAlchemy RowProxy oggetto ha metodi dict simile - .items() per ottenere tutte le coppie nome/valore, .keys() per ottenere solo i nomi (ad esempio per visualizzarli come una riga di intestazione, quindi utilizzare .values() per i valori corrispondenti o utilizzare ciascun chiave per indicizzare nell'oggetto RowProxy, ecc. ecc., in modo che si tratti di un "oggetto intelligente" anziché di una dict semplice non dovresti arrecare un danno eccessivo.

Problemi correlati