¿Cómo selecciono valores literales en una consulta sqlalchemy?

Tengo una consulta que se parece a esto:

query = session.query(Item) \ .filter(Item.company_id == company_id) \ .order_by(Item.id) 

Es una consulta bastante básica. Además de extraer los valores para el artículo, quiero agregar un valor adicional a la mezcla y que me lo devuelvan. En SQL sin formato, haría esto:

 SELECT *, 0 as subscribed FROM items WHERE company_id = 34 ORDER BY id 

¿Cómo puedo agregar manualmente ese valor a través de sqlalchemy?

Tendrá que usar un literal_column , que se parece un poco a esto:

 sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.literal_column("0")) 

Tenga en cuenta que el argumento de text se inserta en la consulta sin ninguna transformación; esto puede exponerlo a una vulnerabilidad de Inyección de SQL si acepta valores para el parámetro de texto desde fuera de su aplicación. Si eso es algo que necesita, querrá usar bindparam , que es tan fácil de usar; Pero tendrás que inventar un nombre:

 sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.bindparam("zero", 0)) 

Como se menciona en los comentarios de la respuesta aceptada, hay una “abreviatura” para bindparam() que alivia la necesidad de encontrar un nombre para el literal bindparam, literal() :

Devuelve una cláusula literal, vinculada a un parámetro de enlace.

Así que uno no tiene que escribir

 session.query(Item, bindparam("zero", 0).label("subscribed")) 

pero solo

 session.query(Item, literal(0).label("subscribed")) 

sin tener que preocuparse por citar, etc., si pasa cadenas o algo así.