Crea, recupera, actualiza y borra entidades

Los objetos de datos en Datastore se denominan entidades y cada una de ellas se clasifica en un tipo con el propósito de realizar consultas. Por ejemplo, si escribes una aplicación de recursos humanos, puedes representar a cada empleado con una entidad del tipo Employee. Ten en cuenta que los valores de datos de la entidad tienen el formato de propiedades. Para obtener más información sobre las entidades, consulta la documentación sobre rutas principales y transacciones.

Creación de entidades y configuración de propiedades

Las entidades se crean y configuran llamando al método constructor para la clase del modelo. Consulta Crear y usar clases de modelo de entidades para obtener más información acerca de la creación de clases de modelos de entidades.

En el ejemplo siguiente puedes ver cómo invocar un constructor de clase de modelo con los argumentos de palabras clave:

sandy = Account(
    username='Sandy', userid=123, email='sandy@example.com')

Este código crea un objeto en la memoria principal de tu programa. Sin embargo, ten en cuenta que la entidad desaparece cuando finaliza el proceso, por lo que también debes conservar la entidad en Datastore mediante una llamada a put() de la siguiente manera:

sandy_key = sandy.put()

Ten en cuenta que esto muestra una clave que puedes usar para recuperar la entidad de Datastore más adelante.

Configura las propiedades mediante una de las siguientes opciones:

Sin importar cómo elijas configurar las propiedades de la entidad, los tipos de propiedad (en este caso, StringProperty y IntegerProperty) aplican la verificación del tipo.

Por ejemplo:

bad = Account(
    username='Sandy', userid='not integer')  # raises an exception
...
sandy.username = 42  # raises an exception

Recupera entidades con claves

Si tienes la clave de una entidad, puedes recuperar la entidad desde Datastore:

sandy = sandy_key.get()

Los métodos clave kind() y id() recuperan el tipo y el identificador de la entidad con la clave:

kind_string = sandy_key.kind()  # returns 'Account'
ident = sandy_key.id()  # returns '2'

También puedes usar la clave de entidad y obtener una string codificada apropiada para incorporar en una URL:

url_string = sandy_key.urlsafe()

Esto produce un resultado como agVoZWxsb3IPCxIHQWNjb3VudBiZiwIM, que puede usarse luego para reconstruir la clave y recuperar la entidad original:

sandy_key = ndb.Key(urlsafe=url_string)
sandy = sandy_key.get()

¡Ten en cuenta que la string segura para URL parece encriptada, pero no lo está! Puede decodificarse con facilidad para recuperar el tipo de entidad original y el identificador:

key = Key(urlsafe=url_string)
kind_string = key.kind()
ident = key.id()

Si usas claves seguras para URL como esas, no uses datos sensibles como direcciones de correo electrónico como identificadores de entidades. Una solución posible puede ser usar un hash de los datos sensibles como el identificador. Esto impide que los terceros, que pueden ver las claves encriptadas, las usen para recopilar direcciones de correo electrónico, pero no evita que, de forma independiente, generen su propio hash de una dirección de correo electrónico conocida y la usen con el fin de verificar si esa dirección está presente en Datastore.

Actualiza entidades

Para actualizar una entidad existente, recupérala de Datastore, modifica sus propiedades y vuelve a almacenarla.

sandy = key.get()
sandy.email = 'sandy@example.co.uk'
sandy.put()

Puedes ignorar el valor que muestra put() en este caso, ya que la clave de entidad no cambia cuando la actualizas.

Borra entidades

Cuando ya no se necesita una entidad, puedes quitarla de Datastore mediante el método delete() de la clave:

sandy.key.delete()

Ten en cuenta que esta es una operación sobre la clave, no sobre la entidad en sí. Siempre muestra None.

Borrar entidades de manera masiva

Si necesitas borrar una gran cantidad de entidades, te recomendamos usar Dataflow para borrar entidades de manera masiva.

Usa operaciones por lotes

Puedes procesar un grupo de entidades o claves en una sola llamada en lugar de hacerlo de forma individual en llamadas separadas, por ejemplo, dentro de un bucle. Esto da como resultado una sola llamada de procedimiento remoto (RPC) para el lote, en lugar de una llamada RPC separada para cada entidad.

El siguiente código te muestra cómo puedes hacerlo:

list_of_keys = ndb.put_multi(list_of_entities)
list_of_entities = ndb.get_multi(list_of_keys)
ndb.delete_multi(list_of_keys)

En el código anterior, pasas una lista de objetos clave a ndb.get_multi a fin de recuperar varias entidades en un lote; ndb.get_multi muestra una lista de objetos de entidades, con valores None para las claves que no tienen una entidad correspondiente en Datastore. Si obtienes las entidades de esta manera, realizas menos llamadas a Datastore para todo el lote (la cantidad de llamadas por lote depende de tu configuración del tamaño del lote).