2009-04-12 7 views

Antwort

6

können Sie das bulkloader.py-Tool verwenden:

Das bulkloader.py Werkzeug das Python-SDK mit enthalten sind, können Daten auf Ihren Anwendung Datenspeicher laden. Mit nur einem kleinen Setup können Sie neue Datenspeicher-Entities aus CSV-Dateien erstellen.

+0

Mit ein wenig zusätzliche Arbeit, können Sie auch Daten direkt laden aus einer SQL-Datenbank oder einer anderen Datenquelle. –

3

Ich habe nicht die perfekte Lösung, aber ich schlage vor, dass Sie mit der App Engine Console gehen. App Engine Console ist ein kostenloses Plugin, mit dem Sie einen interaktiven Python-Interpreter in Ihrer Produktionsumgebung ausführen können. Es ist hilfreich für einmalige Datenmanipulation (z. B. initiale Datenimporte) aus verschiedenen Gründen:

  1. Es ist der gute alte Read-Eval-Print-Interpreter. Sie können Dinge nacheinander tun, anstatt den perfekten Importcode auf einmal zu schreiben und im Batch auszuführen.
  2. Sie haben interaktiven Zugriff auf Ihr eigenes Datenmodell, sodass Sie Objekte aus dem Datenspeicher lesen/aktualisieren/löschen können.
  3. Sie haben interaktiven Zugriff auf die URL-Fetch-API, sodass Sie Daten Stück für Stück herunterziehen können.

Ich schlage vor, etwa wie folgt:

  1. Erhalten Sie Ihr Datenmodell in der Entwicklungsumgebung arbeiten
  2. Teilen Sie Ihre CSV-Datensätze in Stücke von unter 1.000. Veröffentlichen Sie sie irgendwo wie Amazon S3 oder eine andere URL.
  3. Installieren Sie die App Engine-Konsole in Ihrem Projekt, und schieben Sie sie in die Produktion.
  4. Melden Sie sich bei der Konsole an. (Nur Administratoren können die Konsole verwenden, damit Sie in Sicherheit sind. Sie können sie sogar so konfigurieren, dass HTTP 404 von nicht autorisierten Benutzern "verschleiert" wird.Für jedes Stück Ihrer CSV)
  5. :
    1. Verwenden URLFetch einen Teil der Daten nach unten ziehen
    2. über die eingebauten in csv Modul Ihre Daten zerhacken, bis Sie eine Liste von nützlichen Datenstrukturen haben (höchstwahrscheinlich eine Liste von Listen oder so ähnlich)
    3. eine for Schleife schreiben, durch jede einzelne Datenstruktur in der Liste iterieren:
      1. mit allen richtigen Eigenschaften ein Datenobjekt erstellen
      2. put() es in den Datenspeicher

sollten Sie feststellen, dass nach einer Iteration bis # 5, dann können Sie entweder kopieren und einfügen, oder auch einfache Funktionen schreiben, um die Geschwindigkeit Ihres Aufgabe importieren. Auch beim Abrufen und Verarbeiten Ihrer Daten in den Schritten 5.1 und 5.2 können Sie sich Zeit nehmen, bis Sie sicher sind, dass Sie alles perfekt haben.

(Hinweis, App Engine-Konsole arbeitet zur Zeit am besten mit Firefox.)

+0

Anstatt die App Engine-Konsole zu verwenden, wäre das Skript remote_api_shell.py besser. Weitere Informationen erhalten Sie hier: https://developers.google.com/appengine/docs/python/tools/remoteapi#Running_Remote_Shell –

2

siehe unter Verwendung von Verwenden von Remote-API und Operationen für mehrere Entitäten. Ich werde ein Beispiel auf NDB mit Python zeigen, wo unsere Test.csv die folgenden Werte mit Semikolon getrennt enthält:

1;2;3;4 
5;6;7;8 

Zuerst haben wir Module importieren müssen:

import csv 
from TestData import TestData 
from google.appengine.ext import ndb 
from google.appengine.ext.remote_api import remote_api_stub 

Dann müssen wir schaffen Fern api Stub:

remote_api_stub.ConfigureRemoteApi(None, '/_ah/remote_api', auth_func, 'your-app-id.appspot.com') 

weitere Informationen zur Verwendung von Remote-api haben einen Blick auf this answer.

kommt dann den Hauptcode, der im Grunde führt die folgenden Dinge:

  1. Öffnet die Test.csv Datei.
  2. Legt das Trennzeichen fest. Wir verwenden Semikolon.
  3. Dann haben Sie zwei verschiedene Optionen, um eine Liste von Entitäten zu erstellen:
    1. Verwenden von Kartenreduzierungsfunktionen.
    2. Listenverstehen verwenden.
  4. Am Ende legen Sie die gesamte Liste der Entitäten.

Hauptcode:

# Open csv file for reading. 
with open('Test.csv', 'rb') as file: 
    # Set delimiter. 
    reader = csv.reader(file, delimiter=';') 

    # Reduce 2D list into 1D list and then map every element into entity. 
    test_data_list = map(lambda number: TestData(number=int(number)), 
      reduce(lambda list, row: list+row, reader) 
     ) 

    # Or you can use list comprehension. 
    test_data_list = [TestData(number=int(number)) for row in reader for number in row] 

    # Batch put whole list into HRD. 
    ndb.put_multi(test_data_list) 

Der put_multi Betrieb kümmert sich auch um sicherstellen zu Charge entsprechende Anzahl von Einheiten in einer einzelnen HTTP-POST-Anfrage.

einen Blick auf diese Dokumentation haben für weitere Informationen:

Verwandte Themen