Frage an google-cloud-datastore, google-app-engine – Wie lösche ich alle Datenspeicher in Google App Engine?

122

Weiß jemand, wie man alle Datenspeicher löschtGoogle App Engine?

db.delete (db.Query (keys_only = True)). Weitere Details hierstackoverflow.com/a/10856555/290340. Evan Plaice
Wie von @systempuntoout unten hervorgehoben, hat GAE jetzt eineDatastore Admin So können Sie unter anderem Massenentitäten ohne Codierung löschen. Dieses Feature muss hier auftauchen, anstatt im dritten Kommentar vergraben zu werden. ralfoide
Der Datenspeicheradministrator funktioniert nicht (die Seite lädt einen Iframe auf einen nicht vorhandenen Host), sodass wir weiterhin die Methode db.delete verwenden müssen. user153275
Geben Sie an der Eingabeaufforderung cmd Folgendes ein, um alle Daten auf dem Entwicklungsserver zu löschen:/path/to/google_appengine/dev_appserver.py --clear_datastore yes myappname/  Wobei meinAppname Ihr Verzeichnis ist, das Ihre app.yaml-Datei für die App enthält. Sie müssen zu diesem Verzeichnispfad wechseln. Kredit: Steven Almeroth und Melllvar für die Antwort unten gsinha
db.delete(db.Query()) Andrey Gubarev

Deine Antwort

27   die antwort
0

Wenn Sie ndb verwenden, die Methode, mit der ich den Datenspeicher geleert habe:

ndb.delete_multi(ndb.Query(default_options=ndb.QueryOptions(keys_only=True)))
Ich denke nicht, dass das funktionieren wird. Appengine beschwert sich überSorry, unexpected error: The kind "__Stat_Kind__" is reserved. Dies scheint, als ob Appengine eine interne Statistikeinheit hat, die mit dieser Methode verfügbar gemacht werden kann (möglicher Fehler an ihrem Ende?) disappearedng
3

Sie können dies über das Webinterface tun. Melden Sie sich in Ihrem Konto an und navigieren Sie mit den Links auf der linken Seite. In der Datenspeicherverwaltung haben Sie die Möglichkeit, Daten zu ändern und zu löschen. Verwenden Sie die entsprechenden Optionen.

15

Wenn Sie über eine erhebliche Datenmenge verfügen, müssen Sie ein Skript verwenden, um diese zu löschen. Sie können jedoch remote_api verwenden, um den Datenspeicher auf der Clientseite auf einfache Weise zu löschen.

0

Für Java

DatastoreService db = DatastoreServiceFactory.getDatastoreService();
List<Key> keys = new ArrayList<Key>();
for(Entity e : db.prepare(new Query().setKeysOnly()).asIterable())
    keys.add(e.getKey());
db.delete(keys);

Funktioniert gut in Development Server

11

Hier geht's: Gehen Sie zu Datastore Admin, wählen Sie den zu löschenden Entitätstyp aus und klicken Sie auf Löschen. Mapreduce kümmert sich um das Löschen!

2

Wenn Sie über viele Daten verfügen, kann die Verwendung der Weboberfläche zeitaufwändig sein. DasApp Engine Launcher Mit dem Dienstprogramm können Sie alles auf einmal löschen, indem Sie das Kontrollkästchen "Datenspeicher beim Start löschen" aktivieren. Dieses Dienstprogramm ist jetzt sowohl für Windows als auch für Mac (Python-Framework) verfügbar.

0

Fortsetzung der Idee von svpino Es ist ratsam, Datensätze, die als gelöscht markiert sind, wiederzuverwenden. (seine Idee war nicht zu entfernen, sondern als "gelöscht" unbenutzte Datensätze zu markieren). Ein bisschen Cache / Memcache für die Arbeitskopie und das Schreiben von Daten, und die Statusunterschiede (vor und nach der gewünschten Aufgabe) zum Datenspeicher machen es besser. für große aufgaben ist es möglich, itermediate difference chunks in den datenspeicher zu schreiben, um datenverlust zu vermeiden, wenn memcache verschwindet. um es verlustsicher zu machen, ist es möglich, die Integrität / das Vorhandensein von zwischengespeicherten Ergebnissen zu überprüfen und die Aufgabe (oder den erforderlichen Teil) neu zu starten, um fehlende Berechnungen zu wiederholen. Wenn die Datendifferenz in den Datenspeicher geschrieben wird, werden die erforderlichen Berechnungen in der Warteschlange verworfen.

Eine andere Idee, die der Map Reduced ähnelt, besteht darin, die Entity-Art in mehrere verschiedene Entity-Arten zu unterteilen, damit sie zusammen gesammelt und für den Endbenutzer als einzelne Entity-Art sichtbar wird. Einträge werden nur als "gelöscht" gekennzeichnet. Wenn die Anzahl der "gelöschten" Einträge pro Shard eine bestimmte Grenze überschreitet, werden "lebendige" Einträge auf andere Shards verteilt, und dieser Shard wird für immer geschlossen und dann manuell von der Dev-Konsole gelöscht (zu geringeren Kosten raten). upd: scheint keine drop table an der konsole zu sein, lösche nur record by record zum regulären preis.

Es ist möglich, eine große Menge von Datensätzen durch Abfragen nach Chunks zu löschen, ohne dass ein Fehler auftritt (zumindest lokal). Nach Ablauf der Zeit besteht die Möglichkeit, den nächsten Versuch fortzusetzen:


    qdelete.getFetchPlan().setFetchSize(100);

    while (true)
    {
        long result = qdelete.deletePersistentAll(candidates);
        LOG.log(Level.INFO, String.format("deleted: %d", result));
        if (result <= 0)
            break;
    }
Manchmal ist es auch nützlich, ein zusätzliches Feld in der Primärtabelle zu erstellen, anstatt Kandidaten (zugehörige Datensätze) in eine separate Tabelle zu stellen. und ja, das Feld kann ein nicht indiziertes / serialisiertes Array mit geringen Berechnungskosten sein.
2

Für den Entwicklungsserver können Sie den Server nicht über den Google App Engine-Starter, sondern über das Terminal wie folgt ausführen:

dev_appserver.py --port = [Portnummer] --clear_datastore = yes [Name der Anwendung]

Beispiel: Meine Anwendung "reader" wird auf Port 15080 ausgeführt. Nachdem der Code geändert und der Server neu gestartet wurde, wird "dev_appserver.py --port = 15080 --clear_datastore = yes reader" ausgeführt.

Das ist gut für mich.

0

Für alle, die eine schnelle Lösung für den Dev-Server benötigen (Stand: Februar 2016):

Stoppen Sie den Dev-Server.Löschen Sie dieZiel Verzeichnis.Erstellen Sie das Projekt neu.

Dadurch werden alle Daten aus dem Datenspeicher gelöscht.

3

Öffnen Sie "Datastore Admin" für Ihre Anwendung und aktivieren Sie Admin. Dann werden alle Ihre Entitäten mit Kontrollkästchen aufgelistet. Sie können die unerwünschten Elemente einfach auswählen und löschen.

2

Hinzufügen einer Antwort zu den jüngsten Entwicklungen.

Google hat kürzlich die Administratorfunktion für den Datenspeicher hinzugefügt. Über diese Konsole können Sie Ihre Entitäten sichern, löschen oder in eine andere App kopieren.

https://developers.google.com/appengine/docs/adminconsole/datastoreadmin#Deleting_Entities_in_Bulk

0

Ich war so frustriert über bestehende Lösungen fürLöschen aller Daten im Live-Datenspeicher dass ich eine kleine GAE-App erstellt habe, die innerhalb von 30 Sekunden eine ganze Menge Daten löschen kann.

Wie zu installieren etc:https://github.com/xamde/xydra

3
Quelle

Ich habe das vonhttp://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 mit dem Namen utils.py erstellt und Folgendes ausgegeben:

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 über alle Entitäten einer bestimmten Art iterieren, ihre Daten extrahieren oder sie ändern und die aktualisierten Entitäten im Datenspeicher speichern können.

Laufen Sie mit!

Starten Sie jetzt Ihre interaktive Appengine-Konsole:

$python appengine_console.py <app_id_here>

Das sollte die interaktive Konsole starten. Darin erstellen Sie eine Unterklasse von Model:

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

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

Und schließlich führen Sie es aus (von Ihrer interaktiven Konsole aus): mapper = MyModelDeleter () mapper.run ()

Das ist es!

1

Ich möchte oft nicht den gesamten Datenspeicher löschen, also ziehe ich eine saubere Kopie von /war/WEB-INF/local_db.bin aus der Quellcodeverwaltung. Es mag nur ich sein, aber es scheint, als müsste ich die Datei selbst bei angehaltenem Dev-Modus physisch entfernen, bevor ich sie ziehen kann. Dies ist unter Windows mit dem Subversion-Plugin für Eclipse.

58

Der beste Ansatz ist die von Nick vorgeschlagene Remote-API-MethodeApp Engine Ingenieur ausGoogle, also vertraue ihm.

Es ist nicht so schwierig, und das neueste SDK 1.2.5 bietet remote_shell_api.py von der Stange. Laden Sie das neue SDK herunter. Dann folge den Schritten:

Verbinden Sie den Remote-Server in Ihrer Kommandozeile:remote_shell_api.py yourapp /remote_api Die Shell fragt nach Ihren Anmeldeinformationen und erstellt, falls autorisiert, eine Python-Shell für Sie. Sie benötigen den Setup-URL-Handler für / remote_api in Ihrer app.yaml

Holen Sie sich die Objekte, die Sie löschen möchten. Der Code sieht ungefähr so ​​aus:

    from models import Entry
    query = Entry.all(keys_only=True)
    entries =query.fetch(1000)
    db.delete(entries)
    \# This could bulk delete 1000 entities a time

Update 28.10.2013:

remote_shell_api.py wurde ersetzt durchremote_api_shell.py, und du solltest dich mit verbindenremote_api_shell.py -s your_app_id.appspot.com, gemäßdie Dokumentation.

Es gibt eine neue experimentelle FunktionDatastore AdminNachdem Sie es in den App-Einstellungen aktiviert haben, können Sie Ihren Datenspeicher über die Web-Benutzeroberfläche sowohl als Massenlöscher als auch als Backup sichern.

+1 ... aber: Ab 2013 existiert remote_shell_api.py nicht. Der aktuelle Skriptname lautet remote_api_shell.py. Wenn Sie ndb verwenden (was die meisten Leute heutzutage tun), wird empfohlen, ndb.delete_multi (model.Entry.query (). Fetch (keys_only = True)) zu verwenden. Uri
Nur ein FYI, damit Sie die Remote-API verwenden können, müssen Sie sie in Ihrer Anwendung zuerst mithilfe der integrierten Funktionen aktivieren: - remote_api: in Ihrer YAML-Datei. Weitere Infos unterdevelopers.google.com/appengine/articles/remote_api Zaffiro
Sie müssen dies in 500 Entity-Sets tun, sonst erhalten Sie: BadRequestError: Sie können nicht mehr als 500 Entities in einem einzigen Aufruf löschen marcc
@Juvenn, noch eine Frage: Gibt es eine Möglichkeit, remote_api_shell zu automatisieren, so dass ich ein Skript implementieren kann (anstelle der interaktiven Shell). Uri
6

Der Null-Setup-Weg, dies zu tun, besteht darin, eine HTTP-Anforderung mit beliebigem Ausführungscode an den Verwaltungsdienst zu senden, über den Ihre laufende App automatisch verfügt:

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())'}))
Dies funktioniert nur für den Entwicklungsserver. Gibt es ein Produktionsäquivalent? Gady
Genial, genau das, was ich in meinem Fall brauchte. Mason
0

Für jeden Datenspeicher, der nicht lokal, sondern auf App-Engine ausgeführt wird, können Sie den verwendenneue Datenspeicher-API. Hier istEine Einführung in die ersten Schritte.

Ich habe ein Skript geschrieben, das alle nicht eingebauten Entitäten löscht. Die API ändert sich ziemlich schnell, daher habe ich sie als Referenz beim Festschreiben geklont990ab5c7f2063e8147bcc56ee222836fd3d6e15b

from gcloud import datastore
from gcloud.datastore import SCOPE
from gcloud.datastore.connection import Connection
from gcloud.datastore import query

from oauth2client import client

def get_connection():
  client_email = '[email protected]'
  private_key_string = open('/path/to/yourfile.p12', 'rb').read()

  svc_account_credentials = client.SignedJwtAssertionCredentials(
    service_account_name=client_email,
    private_key=private_key_string,
    scope=SCOPE)

  return Connection(credentials=svc_account_credentials)


def connect_to_dataset(dataset_id):
  connection = get_connection()
  datastore.set_default_connection(connection)
  datastore.set_default_dataset_id(dataset_id)

if __name__ == "__main__":
  connect_to_dataset(DATASET_NAME)
  gae_entity_query = query.Query()
  gae_entity_query.keys_only()
  for entity in gae_entity_query.fetch():
    if entity.kind[0] != '_':
      print entity.kind
      entity.key.delete()
3

In Python 1.3.8 ist hierfür ein experimenteller Administrator integriert. Siesagen: "Aktivieren Sie das folgende integrierte Element in Ihrer app.yaml-Datei:"

builtins:
- datastore_admin: on

"Das Löschen von Datenspeichern ist derzeit nur mit der Python-Laufzeit verfügbar. Java-Anwendungen können diese Funktion jedoch weiterhin nutzen, indem sie eine nicht standardmäßige Python-Anwendungsversion erstellen, mit der Datenspeicher-Admin in der Datei app.yaml aktiviert wird. Die native Unterstützung für Java wird eingeschlossen in einer kommenden Version. "

Dies ist die derzeit einfachste Lösung, um eine bestimmte Entität als Bulk zu löschen systempuntoout
Beim Hinzufügen der Konfiguration in app.yaml ist ein Fehler aufgetreten. Stattdessen können wir es über die Seite "Anwendungseinstellung" im Abschnitt "Administration" aktivieren. Es gibt eine Schaltfläche, um es zu aktivieren Sundeep
27

Die schnellste und effizienteste Möglichkeit, Massenlöschvorgänge im Datenspeicher durchzuführen, ist die Verwendung der neuenMapper-API spätestens angekündigtGoogle I / O.

Wenn Ihre Sprache der Wahl istPython, müssen Sie nur Ihren Mapper in einem registrierenmapreduce.yaml Datei und definieren Sie eine Funktion wie folgt:

from mapreduce import operation as op
def process(entity):
 yield op.db.Delete(entity)

AufJava Sie sollten einen Blick darauf werfenDieser Beitrag das deutet auf eine Funktion wie diese hin:

@Override
public void map(Key key, Entity value, Context context) {
    log.info("Adding key to deletion pool: " + key);
    DatastoreMutationPool mutationPool = this.getAppEngineContext(context)
            .getMutationPool();
    mutationPool.delete(value.getKey());
}

BEARBEITEN:
Seit SDK 1.3.8 gibt es eineDatenspeicher-Administratorfunktion für diesen Zweck

Sehr beeindruckend. Vielen Dank. Guido
9

Es gibt verschiedene Möglichkeiten, um Einträge aus dem App Engine-Datenspeicher zu entfernen:

Überlegen Sie zunächst, ob Sie Einträge wirklich entfernen müssen. Dies ist teuer und es ist möglicherweise billiger, sie nicht zu entfernen.

Sie können alle Einträge manuell mit dem Datastore Admin löschen.

Sie können die Remote-API verwenden und Einträge interaktiv entfernen.

Sie können die Einträge programmgesteuert mithilfe einiger Codezeilen entfernen.

Sie können sie mithilfe von Task-Warteschlangen und Cursorn massenweise entfernen.

Oder Sie können Mapreduce verwenden, um etwas robusteres und schickeres zu erhalten.

Jede dieser Methoden wird im folgenden Blogeintrag erläutert:http://www.shiftedup.com/2015/03/28/how-to-bulk-delete-entries-in-app-engine-datastore

Ich hoffe es hilft!

3

Ich habe ein Add-In-Bedienfeld erstellt, das mit Ihren bereitgestellten App Engine-Apps verwendet werden kann. In einer Dropdown-Liste werden die Arten aufgelistet, die im Datenspeicher vorhanden sind, und Sie können auf eine Schaltfläche klicken, um "Aufgaben" zu planen, mit denen alle Entitäten einer bestimmten Art oder einfach alles gelöscht werden. Sie können es hier herunterladen:
http://code.google.com/p/jobfeed/wiki/Nuke

69

Wenn du über das redestLive-DatenspeicherÖffnen Sie das Dashboard für Ihre App (Anmeldung am Appengine), dann Datenspeicher -> Dataviewer, wählen Sie alle Zeilen für die Tabelle aus, die Sie löschen möchten, und klicken Sie auf die Schaltfläche Löschen (dies müssen Sie für alle Ihre Tabellen tun). Sie können das gleiche programmgesteuert über die remote_api tun (aber ich habe es nie benutzt).

Wenn du über das redestEntwicklungsdatenspeichermüssen Sie nur die folgende Datei löschen:"./WEB-INF/appengine-generated/local_db.bin". Die Datei wird beim nächsten Ausführen des Entwicklungsservers erneut für Sie generiert, und Sie haben eine leere Datenbank.

Stellen Sie sicher, dass Sie Ihr Projekt anschließend bereinigen.

Dies ist einer der kleinen Fehler, die sich als nützlich erweisen, wenn Sie mit der Google Application Engine spielen. Sie befinden sich im Datenspeicher und ändern dann das JDO-Objektmodell für Ihre beständigen Entitäten. Am Ende werden veraltete Daten angezeigt, die dazu führen, dass Ihre App überall abstürzt.

@svrist Dies gilt jedoch nur für die Python-App-Engine. Weiß jemand, wie eine Abkürzung dafür in Java ist? (In der Zwischenzeit funktioniert JohnIdols Vorschlag gut.) mgiuca
Es gibt einen -c-Parameter für dev_appserver.py, der aus dem Entwicklungsdatenspeicher gelöscht werden kann. svrist
Danke @ John: Wo ist der genaue Pfad in MAC OSX? George Nguyen
Ich meine datenspeicher im appengine server von google manman
3

Das ist, wonach du suchst ...

db.delete(Entry.all(keys_only=True))

Das Ausführen einer Nur-Schlüssel-Abfrage ist viel schneller als ein vollständiger Abruf, und Ihr Kontingent wird einen geringeren Treffer erzielen, da Nur-Schlüssel-Abfragen als kleine Operationen betrachtet werden.

Hier ist einLink zu einer Antwort von Nick Johnson beschreibt es weiter.

Unten finden Sie eine durchgängige REST-API-Lösung zum Abschneiden einer Tabelle ...

Ich richte eine REST-API ein, um Datenbanktransaktionen zu verarbeiten, bei denen Routen direkt dem richtigen Modell / der richtigen Aktion zugeordnet werden. Dies kann durch Eingabe der richtigen URL (example.com/inventory/truncate) und Anmeldung aufgerufen werden.

Hier ist die Route:

Route('/inventory/truncate', DataHandler, defaults={'_model':'Inventory', '_action':'truncate'})

Hier ist der Handler:

class DataHandler(webapp2.RequestHandler):
  @basic_auth
  def delete(self, **defaults):
    model = defaults.get('_model')
    action = defaults.get('_action')
    module = __import__('api.models', fromlist=[model])
    model_instance = getattr(module, model)()
    result = getattr(model_instance, action)()

Zunächst wird das Modell dynamisch geladen (dh Inventory unter api.models gefunden) und anschließend die richtige Methode (Inventory.truncate ()) aufgerufen, wie im Aktionsparameter angegeben.

@Basic_auth ist ein Decorator / Wrapper, der die Authentifizierung für vertrauliche Vorgänge (z. B. POST / DELETE) bereitstellt. Es gibt auch eineoAuth Dekorateur verfügbar, wenn Sie Sicherheitsbedenken haben.

Schließlich heißt die Aktion:

def truncate(self):
  db.delete(Inventory.all(keys_only=True))

Es sieht aus wie Magie, ist aber eigentlich sehr einfach. Das Beste daran ist, dass delete () wiederverwendet werden kann, um ein oder mehrere Ergebnisse zu löschen, indem dem Modell eine weitere Aktion hinzugefügt wird.

26

Sie könnenLöschen Sie den Entwicklungsserver-Datenspeicher Wenn Sie den Server ausführen:

/path/to/dev_appserver.py --clear_datastore=yes myapp

Sie können auch abkürzen--clear_datastore mit-c.

Ich bin mir nicht sicher, ob es eine neue Sache ist, aber die aktuelle Syntax ist jetzt/path/to/google_appengine/dev_appserver.py --clear_datastore yes myappname/ (Beachten Sie das "Ja") Melllvar
Dies ist die nützlichste Methode, um den Datenspeicher während der Entwicklung wiederholt zu löschen. Da die Optionen schnell veraltet sind, lohnt es sich hervorzuheben, dass dieses Flag im Juli 2018 noch vorhanden ist und für dev_appserver funktioniert, der über die gcloud-CLI installiert wurde Michael
Sie können "--clear_datastore" auch mit "-c" abkürzen. Steven Almeroth
Danke @Melllvar, Antwort aktualisiert. Steven Almeroth
doppelter Bonus für weniger Tastenanschläge! nate_weldon
3

Sie können alle Datenspeicher löschen, indem Sie alle Arten einzeln löschen. mit Google Appengine Dashboard. Bitte befolgen Sie diese Schritte.

Einloggen inhttps://console.cloud.google.com/datastore/settingsKlickenÖffnen Sie Datastore Admin. (Aktivieren Sie es, wenn es nicht aktiviert ist.)Wählen Sie alle Objekte aus und klicken Sie auf Löschen. (Führen Sie in diesem Schritt einen Kartenverkleinerungsauftrag aus, um alle ausgewählten Objekte zu löschen.)

Weitere Informationen finden Sie unter Dieses Bildhttp://storage.googleapis.com/bnifsc/Screenshot%20from%202015-01-31%2023%3A58%3A41.png

0

PHP-Variation:

import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.DatastoreServiceFactory;

define('DATASTORE_SERVICE', DatastoreServiceFactory::getDatastoreService());

function get_all($kind) {
    $query = new Query($kind);
    $prepared = DATASTORE_SERVICE->prepare($query);
    return $prepared->asIterable();
}

function delete_all($kind, $amount = 0) {
    if ($entities = get_all($kind)) {
        $r = $t = 0;
        $delete = array();
        foreach ($entities as $entity) {
            if ($r < 500) {
                $delete[] = $entity->getKey();
            } else {
                DATASTORE_SERVICE->delete($delete);
                $delete = array();
                $r = -1;
            }
            $r++; $t++;
            if ($amount && $amount < $t) break;
        }
        if ($delete) {
            DATASTORE_SERVICE->delete($delete);
        }
    }
}

Ja, es wird einige Zeit und 30 Sekunden dauern. ist eine Grenze. Ich überlege, ein Ajax-App-Beispiel zu erstellen, um eine Automatisierung über 30 Sekunden hinaus zu erreichen.

Dies ist nicht einmal gültiges PHP.import? Eine Konstante als Objektinstanz definieren? Josh J
WTF? Nichts davon ist notwendig. Evan Plaice
0
for amodel in db.Model.__subclasses__():
                dela=[]
                print amodel
                try:
                    m = amodel()
                    mq = m.all()
                    print mq.count()
                    for mw in mq:
                        dela.append(mw)
                    db.delete(dela)
            #~ print len(dela)

                except:
                    pass

Verwandte Fragen