2009-04-12 9 views

Odpowiedz

6

Można użyć narzędzia bulkloader.py:

Narzędzie bulkloader.py dołączonego Python SDK mogą przesyłać dane do magazynu danych danej aplikacji . Wystarczy niewielka konfiguracja , aby utworzyć nowe jednostki magazynu danych z plików CSV.

+0

z trochę dodatkowej pracy, można nawet pobrać dane bezpośrednie z bazy danych SQL lub dowolnego innego źródła danych. –

3

Nie mam idealne rozwiązanie, ale proponuję, aby przejść z App Engine Console. App Engine Console to darmowa wtyczka umożliwiająca uruchomienie interaktywnego interpretera języka Python w środowisku produkcyjnym. Przydaje się do jednorazowej manipulacji danymi (np. Import danych początkowych) z kilku powodów:

  1. To jest stary, dobry interpretator wydruku do odczytu. Możesz robić rzeczy po jednym na raz, zamiast pisać idealny kod importu naraz i uruchamiać go partiami.
  2. Masz interaktywny dostęp do własnego modelu danych, dzięki czemu możesz czytać/aktualizować/usuwać obiekty ze składnicy danych.
  3. Masz interaktywny dostęp do interfejsu API pobierania URL, dzięki czemu możesz pobierać dane kawałek po kawałku.

Proponuję coś jak następuje:

  1. Pobierz model danych pracujący w środowisku programistycznym
  2. Splitu rekordy CSV na kawałki pod 1000. Opublikuj je w takim miejscu, jak Amazon S3 lub jakikolwiek inny adres URL.
  3. Zainstaluj konsolę aplikacji App Engine w swoim projekcie i wypchnij ją do produkcji
  4. Zaloguj się do konsoli. (Tylko administratorzy mogą korzystać z konsoli, więc powinieneś być bezpieczny. Możesz nawet skonfigurować go tak, aby HTTP 404 "ukrywał się" przed nieautoryzowanymi użytkownikami.)
  5. dla każdego kawałka swojej csv:
    1. Korzystanie UrlFetch do ciągnięcia w dół kawałek danych
    2. pomocą wbudowanego modułu csv posiekać zapasowych danych, dopóki masz listę użytecznych struktur danych (najprawdopodobniej lista list czy coś takiego)
    3. Napisz for pętli iteracja każdego każdej struktury danych w liście:
      1. utworzyć obiekt danych z wszystkich poprawnych właściwości
      2. put() go do magazynu danych

powinno się okazać, że po jednej iteracji przez # 5, a następnie można albo skopiuj i wklej, albo napisać proste funkcje, aby przyspieszyć zadanie importu. Ponadto, przy pobieraniu i przetwarzaniu danych w krokach 5.1 i 5.2, możesz poświęcić trochę czasu, aż będziesz pewien, że masz go idealnie.

(Uwaga App konsola Silnik pracuje obecnie najlepiej z Firefox.)

+0

Zamiast korzystać z App Engine Console, lepiej byłoby użyć skryptu remote_api_shell.py. Więcej informacji można znaleźć tutaj: https://developers.google.com/appengine/docs/python/tools/remoteapi#Running_Remote_Shell –

0

późniejsza wersja SDK App Engine, można przesłać za pomocą appcfg.py

widzieć appcfg.py

2

By za pomocą zdalnego interfejsu API i operacji na wielu obiektach. Pokażę przykład na NDB przy użyciu Pythona, gdzie nasz Test.csv zawiera następujące wartości oddzielonych średnikiem:

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

najpierw musimy importować moduły:

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

Następnie musimy utworzyć zdalnego api en:

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

Aby uzyskać więcej informacji na temat korzystania z pilota zdalnego api spojrzeć this answer.

Potem przychodzi główny kod, który zasadniczo wykonuje następujące rzeczy:

  1. otwiera plik Test.csv.
  2. Ustawia ogranicznik. Używamy średnika.
  3. Następnie masz dwie różne opcje tworzenia listy obiektów:
    1. Korzystanie z funkcji zmniejszania mapy.
    2. Korzystanie ze sprawdzania listy.
  4. W końcu wsadę włożyć całą listę podmiotów.

Kod Główny:

# 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) 

put_multi operacja zajmuje się również upewniając się wsadowym odpowiedniej liczby jednostek w pojedynczym żądaniu HTTP POST.

Zapraszamy do obejrzenia tej dokumentacji uzyskać więcej informacji: