Как вы загружаете данные в хранилище Google App Engine Datastore?

У меня около 4000 записей, которые мне нужно загрузить в Datastore.

В настоящее время они представлены в формате CSV. Буду признателен, если кто-нибудь укажет мне или объяснит, как массово загружать данные в GAE.


person Community    schedule 12.04.2009    source источник


Ответы (4)


Вы можете использовать инструмент bulkloader.py:

Инструмент bulkloader.py, входящий в состав Python SDK, может загружать данные в хранилище данных вашего приложения. После небольшой настройки вы можете создавать новые объекты хранилища данных из файлов CSV.

person waqas    schedule 12.04.2009
comment
Приложив немного дополнительных усилий, вы даже можете загружать данные прямо из базы данных SQL или любого другого источника данных. - person Nick Johnson; 03.05.2009

У меня нет идеального решения, но я предлагаю вам попробовать консоль App Engine. Консоль App Engine - это бесплатный плагин, который позволяет запускать интерактивный интерпретатор Python в производственной среде. Это полезно для разовых манипуляций с данными (например, для импорта исходных данных) по нескольким причинам:

  1. Это старый добрый интерпретатор чтения-оценки-печати. Вы можете делать что-то по одному, вместо того, чтобы писать идеальный код импорта сразу и запускать его в пакетном режиме.
  2. У вас есть интерактивный доступ к вашей собственной модели данных, поэтому вы можете читать / обновлять / удалять объекты из хранилища данных.
  3. У вас есть интерактивный доступ к API-интерфейсу URL Fetch, поэтому вы можете извлекать данные по частям.

Предлагаю примерно следующее:

  1. Заставьте вашу модель данных работать в вашей среде разработки
  2. Разделите свои CSV-записи на части по 1000 штук. Опубликуйте их где-нибудь, например Amazon S3 или любой другой URL-адрес.
  3. Установите консоль App Engine Console в свой проект и отправьте его в рабочую среду.
  4. Войдите в консоль. (Только администраторы могут использовать консоль, поэтому вы должны быть в безопасности. Вы даже можете настроить ее так, чтобы она возвращала HTTP 404 для «маскировки» от неавторизованных пользователей.)
  5. For each chunk of your CSV:
    1. Use URLFetch to pull down a chunk of data
    2. Используйте встроенный модуль csv для измельчения данных до тех пор, пока у вас не появится список полезных структур данных (скорее всего, список списков или что-то в этом роде)
    3. Write a for loop, iterating through each each data structure in the list:
      1. Create a data object with all correct properties
      2. поместите () его в хранилище данных

Вы должны обнаружить, что после одной итерации до №5 вы можете либо копировать и вставлять, либо писать простые функции для ускорения задачи импорта. Кроме того, с получением и обработкой данных на шагах 5.1 и 5.2 вы можете не торопиться, пока не будете уверены, что у вас все получилось идеально.

(Обратите внимание, что в настоящее время консоль App Engine лучше всего работает с Firefox.)

person JasonSmith    schedule 03.05.2009
comment
Вместо использования консоли App Engine Console лучше использовать скрипт remote_api_shell.py. Дополнительную информацию можно найти здесь: developers.google.com/appengine/docs/ python / tools / - person Jernej Jerin; 02.02.2013

Используя удаленный API и операции с несколькими объектами. Я покажу пример NDB с использованием python, где наш Test.csv содержит следующие значения, разделенные точкой с запятой:

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

Для начала нам нужно импортировать модули:

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

Затем нам нужно создать заглушку удаленного API:

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

Дополнительные сведения об использовании удаленного API см. В этом ответе.

Затем идет основной код, который в основном выполняет следующие функции:

  1. Открывает файл Test.csv.
  2. Устанавливает разделитель. Мы используем точку с запятой.
  3. Then you have two different options to create a list of entities:
    1. Using map reduce functions.
    2. Использование понимания списка.
  4. В конце вы пакетно помещаете весь список сущностей.

Основной код:

# 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 также заботится о том, чтобы обеспечить пакетное количество объектов в одном запросе HTTP POST.

Взгляните на эту документацию для получения дополнительной информации:

person Jernej Jerin    schedule 02.02.2013

более позднюю версию sdk движка приложений можно загрузить с помощью файла appcfg.py

см. appcfg.py

person rbawaskar    schedule 04.07.2009