приложение x1 не может получить доступ к данным приложения x2 - PullRequest
4 голосов
/ 11 марта 2012

Я скопировал некоторые данные из пространства имен из x1 в x2, используя удаленный API и API низкого уровня хранилища данных.

Я получаю доступ к приложению 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 ]

1 голос
/ 22 апреля 2014

Как сказано в этом посте: Миграция в HRD - Как преобразовать строковые ключи в новое приложение все ключи сущности содержат ссылку на идентификатор приложения. Если вы используете ключи, закодированные как String, эта ссылка не будет обновляться при копировании данных в новое приложение. Но вы можете сделать это самостоятельно.

Просто запустите запрос в новой среде, чтобы обновить каждый ключ, чтобы он указывал на новый идентификатор приложения. В этом примере я предполагаю, что каждый объект реализует этот интерфейс:

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());  
    }  
}
0 голосов
/ 10 сентября 2012

Вам нужно исправить ключи, чтобы в них был правильный 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...