Как вы загружаете данные в хранилище данных Google App Engine? - PullRequest
5 голосов
/ 12 апреля 2009

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

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

Ответы [ 4 ]

6 голосов
/ 12 апреля 2009

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

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

3 голосов
/ 03 мая 2009

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

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

Я предлагаю что-то вроде следующего:

  1. Получите вашу модель данных, работающую в вашей среде разработки
  2. Разделите ваши записи CSV на куски менее 1000. Опубликуйте их где-нибудь, например, Amazon S3 или любой другой URL.
  3. Установите консоль App Engine в своем проекте и переведите ее в рабочее состояние
  4. Войдите в консоль. (Только администраторы могут использовать консоль, поэтому вы должны быть в безопасности. Вы даже можете настроить ее так, чтобы HTTP 404 возвращал «плащ» от неавторизованных пользователей.)
  5. Для каждого куска вашего CSV:
    1. Используйте URLFetch для удаления фрагмента данных
    2. Используйте встроенный модуль csv для сортировки ваших данных, пока у вас не появится список полезных структур данных (скорее всего, список списков или что-то в этом роде)
    3. Напишите цикл for, повторяя каждую структуру данных в списке:
      1. Создать объект данных со всеми правильными свойствами
      2. положить () его в хранилище данных

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

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

2 голосов
/ 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. Тогда у вас есть две разные опции для создания списка сущностей:
    1. Использование функций уменьшения карты.
    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.

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

0 голосов
/ 04 июля 2009

более поздняя версия ядра App Engine SDK, можно загрузить с помощью appcfg.py

см. appcfg.py

...