Как загрузить данные из онлайн-хранилища данных GAE на локальный сервер разработки?

Ранее я использовал подход, описанный в документах GAE, для загрузки резервных копий. моих сущностей в реальном хранилище данных.

В настоящее время у меня есть файл csv для каждого типа объекта, который я получил, написав bulkloader.yaml и используя эту команду:

appcfg.py download_data --config_file=bulkloader.yaml --filename=users.csv --kind=Permission --url=http://your_app_id.appspot.com/_ah/remote_api

У меня также есть файл дампа sql3, который я получил с помощью команды:

appcfg.py download_data --kind=<kind> --url=http://your_app_id.appspot.com/_ah/remote_api --filename=<data-filename>

Теперь, если я попробую эту команду:

appcfg.py upload_data --url=http://your_app_id.appspot.com/_ah/remote_api --kind=<kind> --filename=<data-filename>

Заменив URL-адрес на localhost:8080, он запрашивает имя пользователя/пароль. Теперь, даже если указать фиктивное имя пользователя ([email protected]) в http://localhost:8080/_ah/remote_api и установить флажок «admin», это всегда дает мне ошибку аутентификации.

Другая альтернатива, упомянутая в документах, использует это:

appcfg.py upload_data --config_file=album_loader.py --filename=album_data.csv --kind=Album --url=http://localhost:8080/_ah/remote_api <app-directory>

Написал загрузчик, попробовал, тоже просит логин и пароль, а тут принимает что угодно. Результат выглядит следующим образом:

/usr/local/google_appengine/google/appengine/api/search/search.py:232: UserWarning: DocumentOperationResult._code is deprecated. Use OperationResult._code instead.
  'Use OperationResult.%s instead.' % (name, name))
/usr/local/google_appengine/google/appengine/api/search/search.py:232: UserWarning: DocumentOperationResult._CODES is deprecated. Use OperationResult._CODES instead.
  'Use OperationResult.%s instead.' % (name, name))
Application: knowledgetestgame
Uploading data records.
[INFO    ] Logging to bulkloader-log-20121113.210613
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
[INFO    ] Opening database: bulkloader-progress-20121113.210613.sql3
Please enter login credentials for localhost
Email: [email protected]
Password for [email protected]: 
[INFO    ] Connecting to localhost:8080/_ah/remote_api
[INFO    ] Starting import; maximum 10 entities per post
[ERROR   ] [WorkerThread-4] WorkerThread:
Traceback (most recent call last):
  File "/usr/local/google_appengine/google/appengine/tools/adaptive_thread_pool.py", line 176, in WorkOnItems
    status, instruction = item.PerformWork(self.__thread_pool)
  File "/usr/local/google_appengine/google/appengine/tools/bulkloader.py", line 764, in PerformWork
    transfer_time = self._TransferItem(thread_pool)
  File "/usr/local/google_appengine/google/appengine/tools/bulkloader.py", line 933, in _TransferItem
    self.content = self.request_manager.EncodeContent(self.rows)
  File "/usr/local/google_appengine/google/appengine/tools/bulkloader.py", line 1394, in EncodeContent
    entity = loader.create_entity(values, key_name=key, parent=parent)
  File "/usr/local/google_appengine/google/appengine/tools/bulkloader.py", line 2728, in create_entity
    (len(self.__properties), len(values)))
AssertionError: Expected 17 columns, found 18.
[INFO    ] [WorkerThread-5] Backing off due to errors: 1.0 seconds
[INFO    ] Unexpected thread death: WorkerThread-4
[INFO    ] An error occurred. Shutting down...
[ERROR   ] Error in WorkerThread-4: Expected 17 columns, found 18.

[INFO    ] 980 entities total, 0 previously transferred
[INFO    ] 0 entities (278 bytes) transferred in 5.9 seconds
[INFO    ] Some entities not successfully transferred

Всего у меня около 4000 сущностей, здесь написано, что передано 980, но на самом деле я проверяю локальное хранилище данных и не нахожу ни одной из них.

Ниже показан загрузчик, который я использую (я использовал NDB для объекта Guess)

import datetime
from google.appengine.ext import db
from google.appengine.tools import bulkloader
from google.appengine.ext.ndb import key


class Guess(db.Model):
    pass

class GuessLoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'Guess',
                                   [('selectedAssociation', lambda x: x.decode('utf-8')),
                                    ('suggestionsList', lambda x: x.decode('utf-8')),
                                    ('associationIndexInList', int),                                    
                                    ('timeEntered',
                                     lambda x: datetime.datetime.strptime(x, '%m/%d/%Y').date()),
                                    ('rank', int),
                                    ('topicName', lambda x: x.decode('utf-8')),
                                    ('topic', int),
                                    ('player', int),
                                    ('game', int),
                                    ('guessString', lambda x: x.decode('utf-8')),
                                    ('guessTime',
                                     lambda x: datetime.datetime.strptime(x, '%m/%d/%Y').date()),
                                    ('accountType', lambda x: x.decode('utf-8')),
                                    ('nthGuess', int),
                                    ('score', float),
                                    ('cutByRoundEnd', bool),
                                    ('suggestionsListDelay', int),
                                    ('occurrences', float)
                                   ])

loaders = [GuessLoader]

Изменить: я только что заметил эту часть в сообщении об ошибке [ERROR ] Error in WorkerThread-0: Expected 17 columns, found 18., хотя на самом деле я только что просмотрел весь CSV-файл и убедился, что каждая строка имеет 18 столбцов. Я проверил загрузчик и обнаружил, что мне не хватает столбца key, я присвоил ему тип int, но это не работает.


person Mohamed Khamis    schedule 13.11.2012    source источник


Ответы (2)


Если у вас проблемы с аутентификацией, добавьте в appengine_config.py следующее:

if os.environ.get('SERVER_SOFTWARE','').startswith('Development'):
    remoteapi_CUSTOM_ENVIRONMENT_AUTHENTICATION = (
    'REMOTE_ADDR', ['127.0.0.1'])

затем беги

appcfg.py download_data --url=http://APPNAME.appspot.com/_ah/remote_api --filename=dump --kind=EntityName
appcfg.py upload_data --url=http://localhost:8080/_ah/remote_api --filename=dump --application=dev~APPNAME
person Andrin von Rechenberg    schedule 05.11.2015

Попробуйте просто нажать Enter (без имени пользователя/пароля). Это, казалось, помогло мне. Моя команда (обернутая в сценарий bash для предотвращения ошибок импорта, которые я иногда получал):

#!/bin/bash

# Modify path
export PYTHONPATH=$PYTHONPATH:.

# Load data
python /path/to/app/config/appcfg.py upload_data \
--config_file=<my_loader.py> \
--filename=<output.csv> \
--kind=<kind> \
--application=dev~<application_id> \
--url=http://localhost:8088/_ah/remote_api ./

Когда меня попросят ввести Email, я нажму Enter, и все будет загружено на сервер разработки. В данном случае я не использую NDB, хотя не думаю, что это должно иметь значение.

person RocketDonkey    schedule 13.11.2012
comment
@MohamedKhamis Сколько столбцов у вас в CSV? Эта ошибка принимает форму Expected <number of items in config> columns, found <number of columns in CSV.. Я бы предложил удалить key, но также перейти к первому столбцу CSV, который не содержит данных, нажать Ctrl+Space, затем Ctrl+Shift+Right Arrow, а затем фактически удалить столбцы (Alt+HDC в Excel 2007 или просто щелкните правой кнопкой мыши заголовок столбца и нажмите «Удалить»). ). Затем сохраните - возможно, там есть «фантомные» данные (пробелы и т. Д.), Из-за которых GAE считает, что столбцов больше, чем есть. - person RocketDonkey; 14.11.2012