sql - tutorial - ¿Puede el peewee jerarquizar las consultas SELECT de modo que la consulta externa seleccione en un agregado de la consulta interna?
python peewee index (1)
Publiqué la misma pregunta en el grupo de Google peewee-orm. Charles Leifer respondió con prontitud tanto con una respuesta como con nuevos compromisos con el maestro peewee. Entonces, aunque estoy respondiendo mi propia pregunta, obviamente todo el mérito recae en él.
Puede ver el hilo aquí: https://groups.google.com/forum/#!topic/peewee-orm/FSHhd9lZvUE
Pero aquí está la parte esencial, que he copiado de la respuesta de Charles a mi publicación:
He agregado un par de confirmaciones para dominar, lo que debería hacer que sus consultas sean posibles ( https://github.com/coleifer/peewee/commit/22ce07c43cbf3c7cf871326fc22177cc1e5f8345 ).
Aquí está la sintaxis, más o menos, para su primer ejemplo:
SELECT ev_tix, count(1) AS ev_tix_n FROM (SELECT count(1) AS ev_tix FROM ticket GROUP BY event_id) GROUP BY ev_tix ev_tix = SQL(''ev_tix'') # the name of the alias. (Ticket .select(ev_tix, fn.count(ev_tix).alias(''ev_tix_n'')) .from_( Ticket.select(fn.count(Ticket.id).alias(''ev_tix'')).group_by(Ticket.event)) .group_by(ev_tix))
Esto produce el siguiente SQL:
SELECT ev_tix, count(ev_tix) AS ev_tix_n FROM (SELECT Count(t2."id") AS ev_tix FROM "ticket" AS t2 GROUP BY t2."event_id") GROUP BY ev_tix
Estoy usando peewee2.1 con python3.3 y una base de datos sqlite3.7.
Deseo realizar ciertas consultas SELECT en las que:
- Primero selecciono un agregado (recuento, suma), agrupamiento por alguna columna de identificación; entonces
- Luego selecciono de los resultados de (1), agregando sobre su agregado. Específicamente, quiero contar el número de filas en (1) que tienen cada valor agregado.
Mi base de datos tiene una tabla de "Eventos" con 1 registro por evento y una tabla de "Tickets" con 1..N tickets por evento. Cada registro de ticket contiene la identificación del evento como una clave externa. Cada boleto también contiene una columna de "asientos" que especifica el número de asientos comprados. (Un "boleto" es mejor pensado como una transacción de compra para 1 o más asientos en el evento).
A continuación hay dos ejemplos de consultas SQLite de trabajo de este tipo que me dan los resultados deseados:
SELECT ev_tix, count(1) AS ev_tix_n FROM
(SELECT count(1) AS ev_tix FROM ticket GROUP BY event_id)
GROUP BY ev_tix
SELECT seat_tot, count(1) AS seat_tot_n FROM
(SELECT sum(seats) AS seat_tot FROM ticket GROUP BY event_id)
GROUP BY seat_tot
Pero al usar Peewee, no sé cómo seleccionar en el agregado de la consulta interna (recuento o suma) al especificar la consulta externa. Por supuesto, puedo especificar un alias para ese agregado, pero parece que no puedo usar ese alias en la consulta externa.
Sé que Peewee tiene un mecanismo para ejecutar consultas SQL "en bruto", y he usado esa solución de manera exitosa. Pero me gustaría saber si / cómo estas consultas se pueden hacer usando Peewee directamente.