应用程序x1无法访问应用程序x2数据
问题描述:
我使用远程API和低级别数据存储区api将一些名称空间数据从x1复制到x2。应用程序x1无法访问应用程序x2数据
我访问X2应用,得到以下错误的一些数据
java.lang.IllegalArgumentException: app x1 cannot access app x2's data at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:36) at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:76) at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:106) at com.google.appengine.api.datastore.FutureHelper$CumulativeAggregateFuture.get(FutureHelper.java:145)
答
您需要修复了键,以便他们在他们正确的应用程序ID。
这里有点Python中的使用:
key = db.Key(k)
if key.app() == appname:
return db.get(key)
logging.info("Fixing up key from old app %s (%s=%s)" % (key.app() , key_attr , k))
fixed_key = db.Key.from_path(*key.to_path())
答
在本文章中说:Migration to HRD - How to convert string-encoded keys to new application所有的实体按键包含对APP-ID的参考。如果使用以字符串编码的键,则在将数据复制到新应用程序时,该引用将不会更新。但你可以自己做。
只需在新环境中运行一个查询,即可更新每个单键以指向新的应用程序标识。 在这个例子中我假设每个实体实现该接口:
Interface Entity{
public Key getKey();
public void setKey(Key key);
}
现在我可以使用的方法是这样的:
//...
List<Entity> entities = //... your query
for (Entity entity : entities){
entity.setKey(generateNewKey(entity.getKey());
}
//...
//Method written by Nikolay Ivanov in the other post, that recursive generate a new key respecting to parents
private Key generateNewKey(Key key) {
Key parentKey = key.getParent();
if(parentKey == null){
return KeyFactory.createKey(key.getKind(), key.getId());
}else{
Key newParentKey = generateKey(parentKey);
return KeyFactory.createKey(newParentKey, key.getKind(), key.getId());
}
}