Как скопировать сущности хранилища данных между пространствами имен - PullRequest
4 голосов
/ 18 ноября 2010

Я хочу скопировать все данные в одном пространстве имен, скажем www.mysite.com, в другое пространство имен, скажем nightly.latest.mysite.appspot.com. Какой лучший способ сделать это?

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

Я хочу иметь возможность вывести все «производственные» данные в «непроизводственное» пространство имен для тестирования.

Ответы [ 3 ]

6 голосов
/ 19 ноября 2010

Пространство имен является частью Ключа. Таким образом, вы не можете изменить или скопировать все данные из одного пространства имен в другое. Как я понимаю, все, что вы можете сделать, это извлечь все объекты из одного пространства имен и создать НОВЫЕ объекты с такими же свойствами в другом пространстве имен.

4 голосов
/ 24 ноября 2010

Я использую appengine-mapreduce для этого. Я не буду подробно описывать это. Вы можете прочитать руководства по началу работы для получения этой информации.

Прямо сейчас вы должны ввести имя каждого класса для копирования. TODO выясняет, как циклически обойти все результаты __ Stat_Kind __ программно, поэтому каждый вид / класс не нужно указывать отдельно.

import java.util.logging.Logger;

import org.apache.hadoop.io.NullWritable;

import com.google.appengine.api.NamespaceManager;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.tools.mapreduce.AppEngineMapper;

public class DatastoreCopyMapper extends
        AppEngineMapper<Key, Entity, NullWritable, NullWritable> {

    private static final Logger log = Logger
            .getLogger(DatastoreCopyMapper.class.getName());
    private static String destination;

    public DatastoreCopyMapper() {
    }

    @Override
    public void taskSetup(Context context) {
        log.warning("Doing per-task setup");
        destination = context.getConfiguration().get("destination");
        log.warning("destination: " + destination);
    }

    @Override
    public void map(Key key, Entity value, Context context) {

        NamespaceManager.set(destination);
        String name = key.getName();
        long id = key.getId();
        Key destinationKey = null;
        if (name != null) {
            destinationKey = KeyFactory.createKey(key.getKind(), name);
        } else if (id != 0) {
            destinationKey = KeyFactory.createKey(key.getKind(), id);
        }
        Entity destinationEntity = new Entity(destinationKey);
        destinationEntity.setPropertiesFrom(value);
        DatastoreService datastore = DatastoreServiceFactory
                .getDatastoreService();

        datastore.put(destinationEntity);

    }
}

mapreduce.xml

<configurations>
  <configuration name="Copy between namespaces">
    <property>
      <name>mapreduce.map.class</name>
      <value>com.mysite.server.DatastoreCopyMapper</value>
    </property>
    <property>
      <name>mapreduce.inputformat.class</name>
      <value>com.google.appengine.tools.mapreduce.DatastoreInputFormat</value>
    </property>
    <property>
      <name human="Entity Kind to Map Over">mapreduce.mapper.inputformat.datastoreinputformat.entitykind</name>
      <value template="optional">User</value>
    </property>

    <property>
      <name human="Destination Namespace">mapreduce.mapper.inputformat.datastoreinputformat.destination</name>
      <value template="optional">dev.mysite.com</value>
    </property>

  </configuration>
</configurations>
1 голос
/ 18 ноября 2010

К сожалению, в настоящее время нет автоматизированного способа сделать это.

Вам придется перебрать все ваши данные и повторно сохранить их в новом пространстве имен.Вы можете прочитать о Java и пространствах имен в документах для нескольких арендаторов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...