¿Cómo borrar todas las entradas del almacén de datos de google?

He creado una página para eliminar todas las entradas del almacén de datos. Estoy usando self.key.delete() para esto pero ha dejado de funcionar (funcionó una vez, pero ya no funciona).

Mi código de python para borrar entradas:

 class DeletePage(Handler): def get(self): self.key.delete() self.render('deletepage.html') 

Asumiendo que:

  • estás usando la biblioteca ndb
  • Tienes un archivo models.py con los modelos de entidad.

Luego puedes probar algo como esto, conectado en uno de los controladores de la aplicación:

 from google.appengine.ext import ndb import inspect import models for kind, model in inspect.getmembers(models): if not isinstance(model, ndb.model.MetaModel): continue cursor = None while True: keys, next_cursor, more = \ model.query().fetch_page(500, keys_only=True, start_cursor=cursor) if keys: ndb.delete_multi_async(keys) if more and next_cursor: cursor = next_cursor else: break 

Si tiene muchas entidades, lo anterior puede eliminarse al cabo de un tiempo con DeadlineExceededError (después de haber eliminado una serie de entidades). O bien repite la solicitud hasta que todos se hayan ido.

O tal vez incluso intente dividir el trabajo en tareas diferidas, a tiempo para no tener demasiadas solicitudes simultáneas que podrían causar una explosión de instancia. Algo como esto:

 from google.appengine.ext import deferred from google.appengine.ext import ndb import inspect import models def delete_keys(keys): ndb.delete_multi(keys) delay = 0 for kind, model in inspect.getmembers(models): if not isinstance(model, ndb.model.MetaModel): continue cursor = None while True: keys, next_cursor, more = \ model.query().fetch_page(500, keys_only=True, start_cursor=cursor) if keys: deferred.defer(delete_keys, keys, _countdown=delay) delay += 5 if more and next_cursor: cursor = next_cursor else: break