Миграция приложения в хранилище данных с высокой репликацией - теперь проблемы с предками - PullRequest
1 голос
/ 03 ноября 2011

Следуя этим инструкциям: http://neogregious.blogspot.com/2011/04/migrating-app-to-high-replication.html

Мне удалось перейти на хранилище данных с высокой репликацией, однако теперь я получаю следующее исключение:

datastore_errors.BadArgumentError('ancestor argument should match app ("%r" != "%r")' %
        (ancestor.app(), app))

Данные модели выглядят примерно такthis:

class base_business(polymodel.PolyModel):
  created = db.DateTimeProperty(auto_now_add=True)

class business(base_business):
  some_data = db.StringProperty()
  etc..

class business_image(db.Model):
  image = db.BlobProperty(default=None)
  mimetype = db.StringProperty()
  comment = db.StringProperty(required=False)

# the image is associated like so
image_item = business_image(parent = business_item, etc... )
image_item.put()  

Новое имя приложения не было назначено данным модели предка.В настоящий момент данные возвращаются, однако в журналы добавляется это сообщение об исключении.

Фактическая трассировка стека с использованием logging.exception:

2011-11-03 16:45: 40.211 ======= get_business_image исключение [аргумент предка должен соответствовать app ("'oldappname'"! = "S ~ newappname '")] ======= Traceback (последний вызов был последним): файл"/base/data/home/apps/s~newappname/3.354412961756003398/oldappname/entities/views.py", строка 82, в get_business_image business_img = business_image.gql ("ГДЕ ПРЕДСТАВИТЕЛЬ IS: ref_business and is_primary = True", ref_bdb.Key (business_key)). get () Файл "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/init.py", строка 2049, в результатах поиска =Файл self.fetch (1, config = config) "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/init.py", строка 2102, в выборке raw = raw_queryФайл ".Get (limit, offset, config = config)" / base / python_runtime / python_lib / version / 1 / google / appengine / api / datastore.py ", строка 1668, в Get config = config, limit = limit, offset = offset, prefetch_size = limit)) Файл" / base / python_runtime / python_lib / version / 1 / google / appengine / api / datastore.py ", строка 1600, в GetBatcher возвращает self.GetQuery (). run (_GetConnection (), query_options) Файл" /base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py ", строка 1507,в файле GetQuery order = self.GetOrder ()) Файл "/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py", строка 93, в файле positional_wrapper возвращает упакованный файл (* args, ** kwds)"/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_query.py", строка 1722, в файле init ancestor = ancestor) "/ base / python_runtime / python_lib / version / 1/google/appengine/datastore/datastore_rpc.py ", строка 93, в возвращении positional_wrapper упаковано (* args, ** kwds) файл" /base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_query.py "строка 1561, в init (ancestor.app (), app)) BadArgumentError: аргумент предка должен соответствовать приложению ("oldappname"! = "s ~ newappname")

Есть ли способ установить приложение вручную наданные модели?Могу ли я сделать что-то подобное, чтобы решить эту проблему?

if( ancestor.app() != app )
  set_app('my_app')
  put()

Прежде чем я сделаю это или применю любой другой HACK, я должен был что-то сделать для переноса данных?

1 Ответ

3 голосов
/ 03 ноября 2011

Ошибка такого рода обычно возникает потому, что вы используете полностью определенные ключи где-то, которые были сохранены в хранилище данных в виде строк (вместо ReferenceProperty) или вне хранилища данных, например в URL-адресах. Вы должны быть в состоянии обойти это, восстановив любые ключи из внешних источников, так что вы игнорируете идентификатор приложения, что-то вроде этого:

my_key = db.Key.from_path(*db.Key(my_key).to_path())
...