query python sqlalchemy

python - query - sqlalchemy select



SQLAlchemy con count, group_by y order_by usando el ORM (3)

Tengo varias funciones donde necesito hacer una unión de uno a muchos, usando count (), group_by y order_by. Estoy usando la función sqlalchemy.select para producir una consulta que me devolverá un conjunto de id, que luego iteraré para hacer una selección de ORM en los registros individuales. Lo que me pregunto es si hay una manera de hacer lo que necesito usando el ORM en una sola consulta para poder evitar tener que hacer la iteración.

Aquí hay un ejemplo de lo que estoy haciendo ahora. En este caso, las entidades son Ubicación y Guía, mapeadas uno a muchos. Estoy intentando obtener una lista de las principales ubicaciones ordenadas por la cantidad de guías con las que están relacionadas.

def popular_world_cities(self): query = select([locations.c.id, func.count(Guide.location_id).label(''count'')], from_obj=[locations, guides], whereclause="guides.location_id = locations.id AND (locations.type = ''city'' OR locations.type = ''custom'')", group_by=[Location.id], order_by=''count desc'', limit=10) return map(lambda x: meta.Session.query(Location).filter_by(id=x[0]).first(), meta.engine.execute(query).fetchall())

Solución

He encontrado la mejor manera de hacer esto. Simplemente proporcione una from_statement lugar de un filter_by o algo así. Al igual que:

meta.Session.query(Location).from_statement(query).all()


Lo que intenta hacer se asigna directamente a una combinación SQLAlchemy entre una subconsulta [hecha desde su llamada de selección actual] y una tabla. Querrá mover el orden de la subselección y crear una columna separada y etiquetada con conteo (desc); ordene la selección externa por esa columna.

Aparte de eso, no veo mucho que sea obvio.


He encontrado la mejor manera de hacer esto. Simplemente proporcione una from_statement lugar de un filter_by o algo así. Al igual que:

meta.Session.query(Location).from_statement(query).all()


Chicos, encontré esto de la manera difícil, pero SQL Alchemy es compatible con group_by. La documentación en Query no lo dice, pero sí lo admite, ¡lo he usado!

Y, también puedes usar order_by. Iba a crear una clase / consulta especial como tú, pero luego descubrí que hay una función group_by ().

¡¡Espero que esto ayude a alguien!!