Mis favoritos | Español | Acceder

Aspectos generales del API Python del almacén de datos

El almacén de datos de Google App Engine proporciona almacenamiento de datos sólido y escalable para tu aplicación web. El almacén de datos se ha diseñado pensando en aplicaciones web y poniendo énfasis en la lectura y la realización de consultas. Almacena entidades de datos con propiedades, organizadas por tipos definidos de aplicaciones. Puede realizar consultas sobre entidades del mismo tipo, con filtros y criterios de ordenación según claves y valores de propiedad. Todas las consultas se clasifican previamente en índices para obtener resultados rápidos en conjuntos de datos muy grandes. El almacén de datos admite actualizaciones transaccionales por medio de agrupaciones de entidades definidas por la aplicación como la unidad de transaccionalidad de la red de datos distribuida.

Introducción al almacén de datos

El almacén de datos escalable de App Engine almacena y realiza consultas sobre objetos de datos, que se conocen como entidades. Las entidades disponen de una o varias propiedades, es decir, valores con denominación de uno de varios tipos de datos compatibles. Una propiedad puede ser una referencia a otra entidad.

El almacén de datos puede ejecutar varias operaciones en una única transacción y recuperar la transacción entera si falla cualquiera de las operaciones. Esto resulta especialmente útil en el caso de las aplicaciones web distribuidas, en las que es posible que varios usuarios accedan a los mismos objetos de datos o los manipulen al mismo tiempo.

A diferencia de las bases de datos tradicionales, el almacén de datos utiliza una arquitectura distribuida para gestionar el cambio de tamaño de los conjuntos de datos muy grandes. Una aplicación App Engine puede optimizar la forma en que se distribuyen los datos mediante la descripción de relaciones entre objetos de datos y la definición de índices para las consultas.

El almacén de datos de App Engine es totalmente consecuente, pero no es una base de datos relacional. Aunque la interfaz del almacén de datos tiene muchas de las funciones de las bases de datos tradicionales, las características únicas del almacén de datos suponen una forma diferente de diseñar y gestionar los datos que ofrece la posibilidad de cambiar el tamaño automáticamente.

Modelado de datos mediante Python

Las entidades del almacén de datos no tienen un esquema: dos entidades del mismo tipo no están obligadas a contener las mismas propiedades o utilizar los mismos tipos de valores para las mismas propiedades. La aplicación es responsable de asegurar que las entidades cumplirán un esquema cuando sea necesario. Con este objetivo, el SDK Python incluye una biblioteca de funciones de modelado de datos muy completa para facilitar la imposición de un esquema.

En el API Python, un modelo describe un tipo de entidad, incluidos los tipos y la configuración de sus propiedades. Una aplicación define un modelo mediante clases de Python, con atributos de clase que describen las propiedades. Las entidades de un tipo se representan mediante instancias de la clase de modelo correspondiente, con atributos de instancia que representan los valores de la propiedad. Se puede crear una entidad mediante la ejecución del constructor de la clase. A continuación, se puede almacenar mediante la ejecución del método put().

import datetime
from google.appengine.ext import db
from google.appengine.api import users

class Employee(db.Model):
  name = db.StringProperty(required=True)
  role = db.StringProperty(required=True, choices=set(["executive", "manager", "producer"]))
  hire_date = db.DateProperty()
  new_hire_training_completed = db.BooleanProperty()
  account = db.UserProperty()

e = Employee(name="",
             role="manager",
             account=users.get_current_user())
e.hire_date = datetime.datetime.now()
e.put()

El API de almacén de datos proporciona dos interfaces para las consultas: una interfaz de objeto de consulta y un lenguaje de consulta parecido a SQL llamado GQL. Las consultas devuelven entidades con el formato de las instancias de las clases de los modelos, que se pueden modificar y devolver al almacén de datos.

training_registration_list = [users.User("Alfred.Smith@example.com"),
                              users.User("jharrison@example.com"),
                              users.User("budnelson@example.com")]
employees_trained = db.GqlQuery("SELECT * FROM Employee WHERE account IN :1",
                                training_registration_list)
for e in employees_trained:
    e.new_hire_training_completed = True
    db.put(e)

Entidades y propiedades

Los objetos de datos incluidos en el almacén de datos de App Engine se denominan entidades. Las entidades disponen de una o varias propiedades, es decir, valores con denominación de uno de varios tipos de datos compatibles, incluidos números enteros, valores de punto flotante, cadenas, datos, datos binarios, etc.

Cada entidad incluye también una clave, que la identifica de forma exclusiva. La clave más sencilla contiene un tipo y una ID numérica única proporcionada por el almacén de datos. La ID también puede ser una cadena proporcionada por la aplicación.

Las aplicaciones pueden extraer una entidad del almacén de datos mediante su clave o a través de una consulta que coincida con las propiedades de la entidad. Una consulta puede devolver cero o más entidades, así como devolver los resultados ordenados por valores de propiedad. Una consulta también puede limitar el número de resultados devueltos por el almacén de datos para mantener la memoria disponible y tiempo de ejecución actual.

A diferencia de las bases de datos relacionales, el almacén de datos de App Engine no requiere que todas las entidades de un determinado tipo dispongan de las mismas propiedades. La aplicación puede especificar y respetar su modelo de datos por medio de bibliotecas incluidas con el kit de desarrollo de software (SDK) o su propio código.

Una propiedad puede tener uno o varios valores. Una propiedad con varios valores puede disponer de valores de distintos tipos. Una consulta en una propiedad con varios valores evalúa si alguno de los valores cumple con los criterios de consulta. Esto da lugar a que dichas propiedades sean útiles a la hora de comprobar la pertenencia a un grupo.

Consultas e índices

Una consulta del almacén de datos de App Engine funciona en todas las entidades de un tipo dado (una clase de datos). Especifica cero o más filtros en claves y valores de propiedad de entidad y cero o más tipos de órdenes. Como resultado de una consulta se devuelve una entidad si la entidad tiene al menos un valor (posiblemente nulo) para cada propiedad mencionada en los filtros de consultas y en los tipos de órdenes, y si los valores de propiedad cumplen todos los criterios de filtro.

Cada consulta del almacén de datos utiliza un índice, una tabla que contiene los resultados de la consulta en el orden deseado. Una aplicación App Engine define sus índices en un archivo de configuración. El servidor web de desarrollo añade automáticamente sugerencias a este archivo a medida que encuentra consultas que no disponen aún de índices configurados. Para configurar manualmente los índices, edita el archivo antes de subir la aplicación. A medida que la aplicación realiza cambios en las entidades del almacén de datos, el almacén actualiza los índices con los resultados correctos. Cuando la aplicación ejecuta una consulta, el almacén de datos extrae los resultados directamente del índice correspondiente.

Este mecanismo admite una amplia gama de consultas y resulta apropiado para la mayoría de las aplicaciones. No obstante, no admite algunos tipos de consultas procedentes de otras tecnologías de bases de datos a los que es posible que estés acostumbrado.

Transacciones y grupos de entidades

Con el almacén de datos de App Engine, cada intento de crear, actualizar o eliminar una entidad se produce en una transacción. Una transacción garantiza que cada cambio que la entidad haya realizado se guarde en el almacén de datos o, en caso de error, no se realice ningún cambio. Esto garantiza la consistencia de los datos de una entidad.

Puedes realizar varias acciones en una entidad dentro de una sencilla transacción mediante el API de transacción. Por ejemplo, supongamos que deseas incrementar un campo de recuento en un objeto. Para ello, necesitas leer el valor del contador, calcular el valor nuevo y, a continuación, almacenarlo. Sin una transacción, es posible que en otro proceso se incremente el contador entre el tiempo de lectura del valor y el tiempo de actualización, cuyo resultado será que tu aplicación tendrá que sobrescribir el valor actualizado. El hecho de realizar la lectura, el cálculo y la escritura en una única transacción garantiza que ningún otro proceso interfiera en el incremento.

Puedes realizar cambios en varias entidades dentro de una única transacción. Para ello, App Engine necesita conocer con anterioridad qué entidades se actualizarán de forma conjunta, así las almacena de modo que admitan transacciones. Debes señalar que una entidad pertenece al mismo grupo de entidades como otra entidad en el momento de su creación. Todas las entidades extraídas, creadas, actualizadas o eliminadas en una transacción deben estar en el mismo grupo de entidades.

Los grupos de entidades están definidos por una jerarquía de relaciones entre entidades. Para crear una entidad en un grupo, debes indicar que la entidad es una entidad secundaria de otra entidad que ya está en el grupo. La otra entidad es la principal. Una entidad sin una entidad principal es una entidad raíz. Una entidad raíz sin entidades secundarias existe por sí misma en un grupo de entidades. Todas las entidades tienen una ruta de relación principal-secundario desde una entidad raíz a sí misma (la ruta más corta que no es principal). Esta ruta es una parte esencial de la clave completa de la entidad. Una clave completa se puede representar en la ruta con el tipo y la ID o el nombre clave de cada entidad.

El almacén de datos utiliza la simultaneidad optimista para gestionar las transacciones. Mientras que una instancia de aplicación esté aplicando cambios a entidades de un grupo de entidades, se producirá un error al instante al intentar actualizar cualquier entidad del grupo. La aplicación puede intentar realizar la transacción de nuevo para aplicarla a los datos actualizados.

Cuotas y límites

Todas las llamadas al API del almacén de datos se toman en cuenta en la cuota de llamadas al API del almacén de datos. Ten en cuenta que algunas llamadas de la biblioteca dan como resultado varias llamadas al API del almacén de datos subyacente.

Los datos que la aplicación envía al almacén de datos se toman en cuenta en la cuota de datos enviados al API del almacén de datos. Los datos que recibe la aplicación del almacén de datos se toman en cuenta en la cuota de datos recibidos del API del almacén de datos.

La cantidad total de datos almacenados actualmente en el almacén de datos para la aplicación no pueden superar la cuota de datos almacenados (ajustables). Esto incluye las claves y propiedades de entidad pero no incluye los índices.

La cantidad de tiempo de CPU que consumen las operaciones del almacén de datos se aplica a las siguientes cuotas:

  • Tiempo de CPU (ajustable)
  • Tiempo de CPU del almacén de datos

Para obtener más información sobre cuotas, consulta Cuotas y la sección "Detalles de cuota" de la consola de administración.

Además de las cuotas, al uso del almacén de datos se le aplican los siguientes límites:

Límite Valor
tamaño máximo de entidad 1 megabyte
número máximo de valores para una entidad en un índice (1) 1.000 valores
número máximo de entidades en una colocación o eliminación por lotes 500 entidades
número máximo de entidades en una obtención por lotes 1.000 entidades
resultados máximos contrarrestados para una consulta 1.000
  1. Una entidad utiliza un valor de un índice para cada columna × cada fila que hace referencia a la entidad, en todos los índices. El número de valores de índices para una entidad puede aumentar de manera importante si una propiedad clasificada en índices tiene varios valores, requiriendo así varias filas con valores repetidos en la tabla.