app x1无法访问app x2数据

时间:2012-03-11 02:36:57

标签: google-app-engine

我使用远程api和低级数据存储api将一些命名空间数据从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)

2 个答案:

答案 0 :(得分:1)

如本文所述:Migration to HRD - How to convert string-encoded keys to new application所有实体键都包含对app-id的引用。如果使用编码为String的键,则在将数据复制到新应用程序时不会更新该引用。但你可以自己做。

只需在新环境中运行查询即可更新每个键以指向新的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());  
    }  
}

答案 1 :(得分:0)

您需要修复密钥,以便他们拥有正确的应用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())