遵循以下说明: 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之前,我应该做些什么作为数据迁移的一部分?
答案 0 :(得分:3)
这种错误通常是因为您在某个地方使用完全限定键,这些键已经存储在数据存储区中作为字符串(而不是ReferenceProperty),或者在数据存储区之外,例如在URL中。您应该能够通过从外部源重建任何键来解决此问题,以便您忽略App ID,如下所示:
my_key = db.Key.from_path(*db.Key(my_key).to_path())