Consulte la lista de atributos en lugar de tuplas en SQLAlchemy

Estoy buscando los identificadores de un modelo y obtengo una lista de (int,) tuplas en lugar de una lista de identificadores. ¿Hay alguna forma de consultar el atributo directamente?

 result = session.query(MyModel.id).all() 

Me doy cuenta de que es posible hacer

 results = [r for (r,) in results] 

¿Es posible que la consulta devuelva ese formulario directamente, en lugar de tener que procesarlo yo mismo?

Related of "Consulte la lista de atributos en lugar de tuplas en SQLAlchemy"

Cuando se pasan los descriptores instrumentados por ORM, como una columna, cada resultado es una tupla con nombre , incluso para una sola columna. Puede usar el nombre de la columna en una lista de comprensión para ‘aplanar’ la lista (puede descartar la llamada .all() , la iteración recupera los objetos también):

 result = [r.id for r in session.query(MyModel.id)] 

o use el hecho de que es una tupla cuando se repite un bucle for y desempaquételo en una tupla de objectives de un solo elemento:

 result = session.query(MyModel.id) for id, in result: # do something with the id 

Este último también podría ser utilizado en una lista de comprensión:

 [id for id, in session.query(MyModel.id)] 

Realmente no tiene ninguna opción para forzar que los resultados de la fila sean solo el valor de id único.

Es extraño que SQLalchemy no esté proporcionando una solución adecuada. En sqlalchemy, si selecciona una variable miembro como una columna, cada resultado es una tupla con nombre, como dijo @Martijn. Llegué a una solución para esto usando la función zip de python

Zip docuementation oficial

zip (seq1 [, seq2 […]]) -> [(seq1 [0], seq2 [0] …), (…)] Devuelve una lista de tuplas, donde cada tupla contiene el i- El elemento de cada una de las secuencias de argumentos. La lista devuelta se trunca en longitud a la longitud de la secuencia de argumentos más corta.

Llegando a tu ejemplo

 result = session.query(MyModel.id).all() result = zip(*result)[0] 

Salida:

 [id1, id2, id3...] 

Cómo funcionará, aplanará la lista de tuplas dadas como argumento si pasa la lista como

 [(key11, key21), (key12,key22)] 

Zip convertirá esta lista de tuplas en

 [(key11, key12), (key21, key22)] 

En su caso, usted desea cada valor inicial de tupe que sea del MyModel para que pueda tomar la tupla 0 de la lista.