Quelle
Ich habe das von http://code.google.com/appengine/articles/remote_api.html .
Erstellen Sie die interaktive Konsole
Zunächst müssen Sie eine interaktive Appenginge-Konsole definieren. Erstellen Sie also eine Datei mit dem Namen appengine_console.py und geben Sie Folgendes ein:
#!/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())
Erstellen Sie die Mapper-Basisklasse
Sobald dies geschehen ist, erstellen Sie diese Mapper-Klasse. Ich habe gerade eine neue Datei namens utils.py erstellt und diese geworfen:
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)
Mapper soll nur eine abstrakte Klasse sein, mit der Sie jede Entität einer bestimmten Art durchlaufen können, sei es, um ihre Daten zu extrahieren oder um sie zu ändern und die aktualisierten Entitäten wieder im Datenspeicher zu speichern.
Lauf damit!
Starten Sie jetzt Ihre interaktive Appengine-Konsole:
$python appengine_console.py <app_id_here>
Damit sollte die interaktive Konsole gestartet werden. Erstellen Sie darin eine Unterklasse von Modell:
from utils import Mapper
# import your model class here
class MyModelDeleter(Mapper):
KIND = <model_name_here>
def map(self, entity):
return ([], [entity])
Führen Sie es schließlich aus (von Ihrer interaktiven Konsole aus): mapper = MyModelDeleter () mapper.run ()
Das ist es!