Est-ce que quelqu'un sait comment supprimer tous les datastore dans Google App Engine ?
Réponses
Trop de publicités?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())'}))
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 !
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