124 votes

Comment supprimer tous les datastores dans Google App Engine ?

Est-ce que quelqu'un sait comment supprimer tous les datastore dans Google App Engine ?

11voto

David Points 61

Voici comment procéder : Allez dans Datastore Admin, puis sélectionnez le type d'entité que vous voulez supprimer et cliquez sur Supprimer. Mapreduce se chargera de la suppression !

6voto

dfichter Points 845

La façon la plus simple de le faire est d'envoyer une requête HTTP de type "execute-arbitrary-code" au service d'administration que votre application possède déjà, automatiquement :

import urllib
import urllib2

urllib2.urlopen('http://localhost:8080/_ah/admin/interactive/execute',
    data = urllib.urlencode({'code' : 'from google.appengine.ext import db\n' +
                                      'db.delete(db.Query())'}))

3voto

Priyank Points 4753

Vous pouvez le faire en utilisant l'interface web. Connectez-vous à votre compte, naviguez avec les liens sur le côté gauche. Dans la gestion du magasin de données, vous avez des options pour modifier et supprimer des données. Utilisez les options respectives.

3voto

Gezim Points 1559

Source :

J'ai trouvé ça dans http://code.google.com/appengine/articles/remote_api.html .

Créer la console interactive

Tout d'abord, vous devez définir une console d'appengine interactive. Donc, créez un fichier appelé appengine_console.py et entrez ceci :

#!/usr/bin/python
import code
import getpass
import sys

# These are for my OSX installation. Change it to match your google_appengine paths. sys.path.append("/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine")
sys.path.append("/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/yaml/lib")

from google.appengine.ext.remote_api import remote_api_stub
from google.appengine.ext import db

def auth_func():
  return raw_input('Username:'), getpass.getpass('Password:')

if len(sys.argv) < 2:
  print "Usage: %s app_id [host]" % (sys.argv[0],)
app_id = sys.argv[1]
if len(sys.argv) > 2:
  host = sys.argv[2]
else:
  host = '%s.appspot.com' % app_id

remote_api_stub.ConfigureRemoteDatastore(app_id, '/remote_api', auth_func, host)

code.interact('App Engine interactive console for %s' % (app_id,), None, locals())

Créer la classe de base Mapper

Une fois que c'est en place, créez cette classe Mapper. J'ai juste créé un nouveau fichier appelé utils.py et j'ai lancé ceci :

class Mapper(object):
  # Subclasses should replace this with a model class (eg, model.Person).
  KIND = None

  # Subclasses can replace this with a list of (property, value) tuples to filter by.
  FILTERS = []

  def map(self, entity):
    """Updates a single entity.

    Implementers should return a tuple containing two iterables (to_update, to_delete).
    """
    return ([], [])

  def get_query(self):
    """Returns a query over the specified kind, with any appropriate filters applied."""
    q = self.KIND.all()
    for prop, value in self.FILTERS:
      q.filter("%s =" % prop, value)
    q.order("__key__")
    return q

  def run(self, batch_size=100):
    """Executes the map procedure over all matching entities."""
    q = self.get_query()
    entities = q.fetch(batch_size)
    while entities:
      to_put = []
      to_delete = []
      for entity in entities:
        map_updates, map_deletes = self.map(entity)
        to_put.extend(map_updates)
        to_delete.extend(map_deletes)
      if to_put:
        db.put(to_put)
      if to_delete:
        db.delete(to_delete)
      q = self.get_query()
      q.filter("__key__ >", entities[-1].key())
      entities = q.fetch(batch_size)

Le mappeur est censé être une classe abstraite qui vous permet d'itérer sur chaque entité d'un type donné, que ce soit pour extraire leurs données, ou pour les modifier et stocker les entités mises à jour dans le magasin de données.

Cours avec ça !

Maintenant, démarrez votre console interactive appengine :

$python appengine_console.py <app_id_here>

Cela devrait lancer la console interactive. Dans celle-ci, créez une sous-classe de Model :

from utils import Mapper
# import your model class here 
class MyModelDeleter(Mapper):
    KIND = <model_name_here>

    def map(self, entity):
        return ([], [entity])

Et, enfin, exécutez-le (depuis votre console interactive) : mapper = MyModelDeleter() mapper.run()

C'est ça !

3voto

kostmo Points 2265

J'ai créé un panneau complémentaire qui peut être utilisé avec vos applications App Engine déployées. Il liste les types qui sont présents dans le datastore dans une liste déroulante, et vous pouvez cliquer sur un bouton pour planifier des "tâches" qui suppriment toutes les entités d'un type spécifique ou simplement tout. Vous pouvez le télécharger ici :
http://code.google.com/p/jobfeed/wiki/Nuke

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X