2012-03-11 8 views
4

リモートapiとlowlevelデータストア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) 

答えて

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()) 
1

としては、この記事で述べている:Migration to HRD - How to convert string-encoded keys to new applicationすべてのエンティティキーはアプリ-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()); 
    } 
} 
この例では、私はすべてのエンティティがこのインタフェースを実装すると仮定します
関連する問題