将应用程序迁移到高复制数据存储区 - 现在是祖先问题

时间:2011-11-02 21:40:21

标签: google-app-engine google-cloud-datastore

遵循以下说明: 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))

模型数据如下所示:

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(最近一次调用最后一次):     在get_business_image中输入文件“/base/data/home/apps/s~newappname/3.354412961756003398/oldappname/entities/views.py”,第82行       business_img = business_image.gql(“WHERE ANCESTOR IS:ref_business and is_primary = True”,ref_business = db.Key(business_key))。get()     文件“/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/init.py”,第2049行,在获取       results = 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/versions/1/google/appengine/api/datastore.py”,第1668行,在Get中       config = config,limit = limit,offset = offset,prefetch_size = limit))     GetBatcher中的文件“/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py”,第1600行       return self.GetQuery()。run(_GetConnection(),query_options)     GetQuery中的文件“/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py”,第1507行       为了= self.GetOrder())     在position_wrapper中输入文件“/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py”,第93行       return wrapped(* args,** kwds)     在 init 中输入文件“/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_query.py”,第1722行       祖先=祖先)     在position_wrapper中输入文件“/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py”,第93行       return wrapped(* args,** kwds)     在 init 中输入文件“/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_query.py”,第1561行       (ancestor.app(),app))   BadArgumentError:ancestor参数应匹配app(“'oldappname'”!=“'s~newappname'”)

有没有办法在模型数据上手动设置应用程序?我可以做这样的事来解决这个问题吗?

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

在我这样做或应用任何其他HACK之前,我应该做些什么作为数据迁移的一部分?

1 个答案:

答案 0 :(得分:3)

这种错误通常是因为您在某个地方使用完全限定键,这些键已经存储在数据存储区中作为字符串(而不是ReferenceProperty),或者在数据存储区之外,例如在URL中。您应该能够通过从外部源重建任何键来解决此问题,以便您忽略App ID,如下所示:

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