2009-07-28 15 views
9

Estoy tratando de hacer algo relativamente simple, escupir los nombres de las columnas y los valores de columna respectivos, y posiblemente filtrar algunas columnas para que no se muestren.SQLAlchemy: Operando en los resultados

Esto es lo que he tratado (después de la conexión inicial, por supuesto):

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 

Miré a la API de SQLAlchemy (v.5), pero era bastante confusa. mi 'resultado' en 'resultados' es un RowProxy, pero no creo que devuelva el objeto correcto para la invocación de .items().

Digamos que mi estructura de la tabla es así:

user_id user_name user_password user_country 
0   john   a9fu93f39uf  usa 

quiero filtrar y especificar los nombres de columna para mostrar (no quiero mostrar la user_password obviamente) - ¿cómo puedo lograr esto?

Respuesta

10

Puede usar results al instante como un iterador.

results = s.execute() 

for row in results: 
    print row 

Selección de columnas específicas se realiza de la siguiente manera:

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 

Para imprimir los nombres de las columnas adicionales a los valores de la forma en que lo ha hecho en su pregunta debe ser la mejor porque RowProxy es realmente nada más que un diccionario ordenado.

IMO la documentación API para SqlAlchemy no es realmente útil para aprender a usarla. Le sugiero que lea el SQL Expression Language Tutorial. Contiene la información más importante sobre las consultas básicas con SqlAlchemy.

+0

El primer fragmento es lo que inicialmente se me ocurrió y devolví todo. Para el segundo fragmento de código, aparece "ValueError: demasiados valores para descomprimir" - hrm? –

+0

Ah, no especifique las columnas adicionales. Probemos de nuevo. –

+0

TypeError: select() toma como máximo 2 argumentos (4 dados) >> s = users_table.select (users_table.c.user_name, users_table.c.user_location, users_table.c.user_name == username) –

14

A SQLAlchemy RowProxy objeto tiene métodos dict-como - .items() para obtener todos los pares de nombre/valor, .keys() para obtener sólo los nombres (por ejemplo, para mostrar como una línea de cabecera, a continuación, utilizar .values() para los valores correspondientes o utilizar cada clave para indexar en el objeto RowProxy, etc., por lo que ser un "objeto inteligente" en lugar de un dict simple no debería incomodarlo indebidamente

Cuestiones relacionadas