Использование java google app engine bulkloader.yaml для загрузки данных с помощью export_transform на __key__ изменяет столбец ID / NAME с id (long) на name (string) - PullRequest
1 голос
/ 16 мая 2011

Я думаю, мой вопрос похож на: BulkLoader -export_transform ИЛИ https://stackoverflow.com/questions/3220911/gae-datastore-export-transform

По сути, я использую загрузчик для резервного копирования и восстановления созданных мною сущностей. Для тестирования я использую вид "Game" и выводю его в файл csv с именем game.csv.

Это процесс, через который я прохожу:

  1. Загрузите вид игры в game.csv, используя:

    appcfg.py download_data --config_file = bulkloader.yaml --kind = Game --filename = game.csv --application = MyAppId --url = http://MyAppId.appspot.com/remote_api --rps_limit = 500 --bandwidth_limit = 2500000 --batch_size = 100

  2. Удалить все игровые объекты. Затем я проверил вкладку средства просмотра хранилища данных портала моего приложения и увидел, что в моем хранилище данных больше нет объектов.

  3. Загрузите вид игры, используя game.csv, созданный с использованием (команда такая же, как download_data , но с upload_data ):

    appcfg.py upload_data --config_file = bulkloader.yaml --kind = Game --filename = game.csv --application = MyAppId --url = http://MyAppId.appspot.com/remote_api --rps_limit = 500 --bandwidth_limit = 2500000 --batch_size = 100

  4. Запустить сервлет, который получает сущность по «имени» (это свойство показано в Game.java ниже).

Произошла следующая ошибка:

Uncaught exception from servlet
java.lang.IllegalStateException: Loaded Entity has name but com.example.app.model.Game has no String @Id
    at com.googlecode.objectify.impl.ConcreteEntityMetadata.setKey(ConcreteEntityMetadata.java:343)
    at com.googlecode.objectify.impl.ConcreteEntityMetadata.toObject(ConcreteEntityMetadata.java:210)
    at com.googlecode.objectify.impl.QueryImpl$ToObjectIterator.translate(QueryImpl.java:640)
    at com.googlecode.objectify.impl.QueryImpl$ToObjectIterator.translate(QueryImpl.java:629)
    at com.googlecode.objectify.util.TranslatingIterator.next(TranslatingIterator.java:35)
    at com.googlecode.objectify.impl.QueryImpl.list(QueryImpl.java:470)

Я подозреваю, что это как-то связано с моим bulkloader.yaml файлом, который не настроен правильно для свойства __key__. Итак, я разместил это ниже:

- import: google.appengine.ext.bulkload.transform
- import: google.appengine.ext.bulkload.bulkloader_wizard
- import: google.appengine.ext.db
- import: google.appengine.api.datastore
- import: google.appengine.api.users

transformers:

- kind: Game
  connector: csv
  connector_options:
    # TODO: Add connector options here--these are specific to each connector.
  property_map:
    - property: __key__
      external_name: key
      export_transform: transform.key_id_or_name_as_string

    - property: __scatter__
      #external_name: __scatter__
      # Type: ShortBlob Stats: 56 properties of this type in this kind.

    - property: genre
      external_name: genre
      # Type: String Stats: 6639 properties of this type in this kind.

    - property: name
      external_name: name
      # Type: String Stats: 6639 properties of this type in this kind.

    - property: releasedate
      external_name: releasedate
      # Type: Date/Time Stats: 6548 properties of this type in this kind.
      import_transform: transform.import_date_time('%Y-%m-%dT%H:%M:%S')
      export_transform: transform.export_date_time('%Y-%m-%dT%H:%M:%S')

Перед удалением и загрузкой данных вид "Игра" (на вкладке просмотра хранилища данных на административном портале приложения) показывает столбец ID/NAME с гиперссылками, которые выглядят как ID = 12345 , ID = 67890 ... для каждого разрешенного ряда.

После загрузки средство просмотра данных показывает столбец ID/NAME с гиперссылками, которые выглядят как NAME = 12345 , NAME = 67890 ... для каждой соответствующей строки.


Возможная причина?

Я на самом деле разместил свой вопрос на https://groups.google.com/forum/?hl=en#!topic/objectify-appengine/FFuB2Onfnzc, но мы не знаем синтаксиса, чтобы избежать преобразования свойства __key__ в строку при загрузке данных назад.

Джефф (создатель Objectify3.0) говорит:

В сообщении об ошибке говорится, что данные в хранилище данных представлены в виде строкового имени. ключ, но ваша сущность Game имеет числовой Long @Id. Я не знаю синтаксис массового загрузчика, но наиболее подозрительная строка такая:

export_transform: transform.key_id_or_name_as_string

Похоже, вы конвертируете здесь все числовые идентификаторы в строки, что было бы вашей проблемой. Оставьте их как числа.

Я пытался удалить export_transform: transform.key_id_or_name_as_string, но при загрузке файл csv пуст.

Может быть, решение состоит в том, чтобы избежать использования параметра --config_file и файла bulkloader.yaml и просто позволить загрузчику / загрузчику данных без каких-либо преобразований?


Дополнительная информация, если она может иметь отношение

Я использую objectify3.0.jar для управления моим хранилищем данных GAE. Так что мой вид игры выглядит так:

public class Game {
    @Id private Long id; //This is my key property, auto generated by objectify  
    private String name;
    private String genre; 
    private Date releasedate;

    //ommitting getters and setters 
}

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Я провел несколько экспериментов и считаю, что у меня есть решение.

Я на самом деле получил идею из другого поста stackoverflow, который я спросил: Использование Java-загрузчика Google App Engine для загрузки всего хранилища данных в один CSV-файл

Исправление состоит в том, чтобы избежать использования --config_file и bulkloader.yaml.

. Я использовал следующее для загрузки каждого вида в один CSV-файл:

appcfg.py download_data --filename=backup.csv --application=MyAppId --url=http://MyAppId.appspot.com/remote_api --rps_limit=500 --bandwidth_limit=2500000 --batch_size=100

Я использовал следующее для загрузки одного CSV-файла обратно в хранилище данных:

appcfg.py upload_data --filename=backup.csv --application=MyAppId --url=http://MyAppId.appspot.com/remote_api --rps_limit=500 --bandwidth_limit=2500000 --batch_size=100

Это те же самые команды, но только download_data и upload_data поменялись местами.

Идея состоит в том, чтобы позволить appcfg загружать и выгружать все сущности (не относящиеся к конкретным видам), т.е. не использовать преобразования экспорта или импорта.

0 голосов
/ 05 января 2014

Чтобы избежать преобразования из Id (целое число) в имя в ключе во время импорта, посмотрите следующее сообщение:

Bulkloader: как определить transform.create_foreign_key () как int?

...