standard google features engine compute classes change app google-app-engine gql

google-app-engine - features - google app engine standard environment



Visor de almacén de datos de App Engine, ¿cómo mostrar el recuento de registros utilizando GQL? (5)

Esta es una de esas cosas sorprendentes que el almacén de datos simplemente no puede hacer. Creo que la manera más rápida de hacerlo sería seleccionar __KEY__ de foo en una lista, y luego contar los elementos en la lista (que no se puede hacer en el visor basado en web).

Si está contento con las estadísticas que pueden ser un poco obsoletas, puede ir a la página Estadísticas del almacén de datos de la consola de administración, que le indicará cuántas entidades de cada tipo había hace algún tiempo. Parece que esas estadísticas suelen tener menos de 10 horas de antigüedad. Desafortunadamente, no puedes consultarlos más específicamente.

¡Pensaría que esto sería fácil para un SQL-igual! Lo que quiero es el equivalente de GQL de:

select count(*) from foo;

y para obtener una respuesta algo similar a:

1972 records.

Y quiero hacer esto en GQL desde la "línea de comando" en el visor de DataStore basado en la web. (Ya sabes, el que muestra 20 a la vez y me permite ver "próximo 20")

De todos modos, estoy seguro de que es muy fácil, no puedo encontrar la sintaxis correcta. Cualquier ayuda sería apreciada.

¡Gracias!


No hay forma de obtener un conteo total en GQL. Aquí hay una forma de obtener un conteo usando Python:

def count_models(model_class, max_fetch=1000): total = 0 cursor = None while True: query = model_class.all(keys_only=True) if cursor: query.with_cursor(cursor) results = query.fetch(max_fetch) total += len(results) print(''still counting: '' + total) if (len(results) < max_fetch): return total cursor = query.cursor()

Puede ejecutar esta función utilizando remote_api_shell o agregar una página personalizada a su sitio de administración para ejecutar esta consulta. Obviamente, si tienes millones de filas, estarás esperando un tiempo. Es posible que pueda aumentar max_fetch, no estoy seguro de cuál es el límite de recuperación actual.


Con Datastore Console directo, no hay una forma directa de hacerlo, pero descubrí cómo hacerlo indirectamente, con la palabra clave OFFSET.

Entonces, dada una tabla, llamaremos a foo, con un campo llamado tipo que queremos verificar para valores llamados "bar":

SELECT * FROM foo WHERE type="bar" OFFSET 1024

(Haremos un juego rápido de "más cálido, más frío" aquí, estilo binario)

Digamos que la consulta no devuelve nada. Cambia OFFSET a 512, luego a 256, 128, 64, ... entiendes la idea. Lo mismo a la inversa: suba a 2048, 4096, 8192, 16384, etc. hasta que no vea ningún registro y luego retroceda.

Acabo de hacer uno aquí en el trabajo. Comenzó con 2048, y notó que aparecieron dos registros. Hay 2049 en la mesa. En un caso más extremo (digamos que hay 3300 registros), podría comenzar con 2048, observe que hay muchos, vaya a 4096, no hay ninguno ... Tome el punto medio (1024 entre 2048 y 4096 es 3072) y observe que tener registros ... Desde allí podría agregar la mitad del punto medio anterior (512) para obtener 3584, y no hay ninguno. Disminuya la mitad (256) para obtener 3328, todavía ninguno. Una vez más abajo la mitad (128) para obtener 3200 y hay registros. Sube la mitad del último valor (64) y aún hay registros. Sube la mitad otra vez (32) a 3296, aún registros, pero tan pequeños que puedes ver fácilmente que hay exactamente 3300.

Lo bueno de esta estadística vs. Datastore para ver cuántos registros hay en una tabla es que puedes limitarla con la cláusula WHERE.


Como se afirma en otras preguntas , parece que no hay función de agregado de cuentas en GQL. La Referencia de GQL tampoco dice que exista la posibilidad de hacer esto, aunque no dice explícitamente que no es posible.

En la consola de desarrollo (ejecutando su aplicación localmente) parece que simplemente haciendo clic en el botón "Listar entidades" le mostrará una lista de todas las entidades de un cierto tipo, y puede ver "Resultados 1-10 de (algún número)" para obtener un recuento total en su entorno de desarrollo.

En producción, puede usar la pestaña "Estadísticas del almacén de datos" (el enlace justo debajo del Visor del almacén de datos), seleccionar "Mostrar estadísticas para: (su tipo de entidad)" y le mostrará el número total de entidades, sin embargo, este no es el más reciente vista de los datos (actualizada "al menos una vez por día").

Como no se puede ejecutar código arbitrario en producción a través del navegador, no creo que decir "use .count() en una consulta" sea útil, pero si está utilizando Remote API , el método .count() es ya no tiene un tope de 1000 entradas a partir de agosto de 2010 , por lo que debería poder ejecutar print MyEntity.all().count() y obtener el resultado que desee.