В Google App Engine, как я могу настроить bulkloader.yaml для обработки необязательного внешнего ключа в модели? - PullRequest
2 голосов
/ 23 января 2012

У меня есть модель в App Engine, которую я экспортирую в формате CSV, а затем импортирую в свою локальную среду разработки, используя appcfg.py и bulkloader.yaml.

Я могу импортировать и экспортировать большинство моделей, но у меня возникают проблемы с моделями, у которых есть внешний ключ, который не всегда присутствует. Я могу использовать лямбда-импорт ниже, чтобы всегда импортировать внешний ключ как None, или использовать преобразование create_foreign_key(), чтобы импортировать внешний ключ, когда каждая строка в моем файле csv имеет внешний ключ.

Как мне настроить bulkloader.py для импорта внешнего ключа, когда он присутствует, и игнорировать его, когда его нет?

- kind: MyModel
  connector: csv
  connector_options:
  property_map:
    - property: myOtherModel
      external_name: myOtherModel
      import_transform: "lambda x: x is None and None or None"
      #import_transform: transform.create_foreign_key('MyOtherModel', key_is_id=True)
      export_transform: transform.key_id_or_name_as_string

Просто раскомментирование второго import_transform вместо лямбда-преобразования приведет к этой ошибке.

File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/bulkload/transform.py", line 127, in generate_foreign_key_lambda
    value = int(value)
ValueError: invalid literal for int() with base 10: ''

Эта ошибка возникает при запуске appcfg.py. Все остальные операции импорта без внешних ключей или там, где внешние ключи всегда присутствуют, работают правильно.

appcfg.py upload_data --config_file=bulkloader.yaml --num_threads=1 --batch_size=50 --url=http://localhost:8080/remote_api --email=Chris --passin --kind=MyModel --filename=MyModel.csv

Столбец myOtherModel в файле csv иногда содержит MyOtherModel.key().id(), а иногда нет.

Например.

myOtherModel
1234
4567

2345

5678

Ответы [ 2 ]

2 голосов
/ 23 января 2012

По умолчанию, когда значение foreign key не существует, reference property принимает значение: None и код для этого:

import_transform: transform.create_foreign_key('MyOtherModel')

Как и в вашем сообщении об ошибке: value does not exist показывает, что вы используете'othercolumn','','anohtercolumn' вместо 'othercolumn',,'anohtercolumn'

Так что, если источник '' должен обрабатывать это:

по этой ссылке: http://eikke.com/python-ifelse-in-lambda/, как комментирует Томас Турман, лямбда-выражение должновыглядеть так:

import-transform: "lambda x: [x, None][x=='']"

Я надеюсь, что это работает для вас

0 голосов
/ 17 июня 2013

Один из способов справиться с этим:

  1. Импортировать все сущности, у которых нет ключей, с параметром bulkloader.yaml, для которого не задано преобразование импорта свойства ключа, указанное для модели.

  2. Экспорт всех объектов.

  3. Импорт объектов. (все из которых теперь будут иметь ключевые значения)

Немного лучшая вариация:

  1. Импортируйте все объекты, у которых есть ключи, с помощью bulkloader.yaml с преобразованием импорта свойств ключа.

  2. Импортировать все сущности без ключей, используя bulkloader.yaml без преобразования импорта свойств ключа.

Это немного громоздко. Я хотел бы, чтобы при импорте сущностям, не имеющим значения ключа, автоматически присваивалось значение.

...