Crear, recuperar, actualizar y eliminar entidades

Los objetos de datos de Datastore se denominan entidades, y cada uno de ellos se clasifica en un tipo concreto para las consultas. Por ejemplo, si estás escribiendo una aplicación de recursos humanos, puedes representar a cada empleado con una entidad de tipo Employee. Ten en cuenta que los valores de los datos de la entidad tienen el formato de propiedades. Para obtener más información sobre las entidades, consulta la documentación sobre rutas de ancestros y transacciones.

Crear entidades y definir propiedades

Para crear una entidad y un conjunto, llama al método constructor de su clase de modelo. Consulta Crear y usar clases de modelo de entidad para obtener información sobre cómo crear una clase de modelo de entidad.

En el siguiente ejemplo se muestra cómo invocar un constructor de clase de modelo con 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 llamando a put(), como se indica a continuación:

sandy_key = sandy.put()

Ten en cuenta que esta función devuelve una clave que puedes usar para recuperar la entidad de Datastore más adelante.

Define las propiedades con una de las siguientes opciones:

  • Especifica las propiedades de la entidad en el constructor con argumentos de palabras clave:
    sandy = Account(
        username='Sandy', userid=123, email='sandy@example.com')
  • Definir propiedades manualmente después de crear la entidad:
    sandy = Account()
    sandy.username = 'Sandy'
    sandy.userid = 123
    sandy.email = 'sandy@example.com'
  • Usa el método de conveniencia populate() para definir varias propiedades en una sola operación:
    sandy = Account()
    sandy.populate(
        username='Sandy',
        userid=123,
        email='sandy@gmail.com')

Independientemente de cómo decidas definir las propiedades de la entidad, los tipos de propiedad (en este caso, StringProperty y IntegerProperty) aplican la comprobación de tipos.

Por ejemplo:

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

Obtener entidades a partir de claves

Si tienes la clave de una entidad, puedes obtenerla de Datastore:

sandy = sandy_key.get()

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

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

También puedes usar la clave de una entidad para obtener una cadena codificada adecuada para insertarla en una URL:

url_string = sandy_key.urlsafe()

Se obtiene un resultado como agVoZWxsb3IPCxIHQWNjb3VudBiZiwIM, que se puede usar más adelante 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 cadena segura para URLs parece encriptada, pero no lo está. Se puede decodificar fácilmente para recuperar el tipo y el identificador de la entidad original:

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

Si usas claves seguras para URLs, no utilices datos sensibles, como direcciones de correo electrónico, como identificadores de entidad. Una posible solución sería usar un hash de los datos sensibles como identificador. De esta forma, se impide que terceros, que pueden ver las claves cifradas, las usen para recoger direcciones de correo electrónico, aunque no se les impide generar de forma independiente su propio hash de una dirección de correo conocida y usarlo para comprobar si esa dirección está presente en Datastore.

Actualizar entidades

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

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

En este caso, puedes ignorar el valor devuelto por put(), ya que la clave de una entidad no cambia cuando la actualizas.

Eliminar entidades

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

sandy.key.delete()

Ten en cuenta que se trata de una operación en la clave, no en la propia entidad. Siempre devuelve None.

Eliminar entidades en bloque

Si necesitas eliminar un gran número de entidades, te recomendamos que utilices Dataflow para eliminar entidades en bloque.

Usar operaciones en lote

Puedes procesar una colección de entidades o claves en una sola llamada en lugar de hacerlo individualmente en llamadas independientes, por ejemplo, dentro de un bucle. De esta forma, se realiza una única llamada a procedimiento remoto (RPC) para el lote, en lugar de una llamada a RPC independiente para cada entidad.

En el siguiente código se muestra cómo 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, se pasa una lista de objetos clave a ndb.get_multi para obtener varias entidades en un lote. ndb.get_multi devuelve una lista de objetos de entidad con valores None para las claves que no tienen una entidad correspondiente en Datastore. De esta forma, se hacen menos llamadas a Datastore para todo el lote. El número de llamadas por lote depende de la configuración del tamaño del lote.