あるappidから別のappidにエンティティをコピーし、ある種のエンティティをzipするユーティリティを作成しただけです。このユーティリティは、キー、NDBの繰り返しプロパティ、serving_urls、および種類で参照されるblobを含む正確なクローンを作成します。これを機能させるには、エンティティのプロパティタイプを知る必要があります。Python 27とNDBを使用していますが、ユーティリティはdb.Modelsも転送します。
種類のすべてのプロパティタイプを検索するコードは次のとおりです。
self.kind = 'Books' # the entities to copy
self.model_mods = {'Books' : 'models'} # modules to import the model from for a kind
module = __import__(self.model_mods[self.kind], globals(), locals(), [self.kind], -1)
self.model_class = getattr(module, self.kind)
entity = self.model_class() # ndb or db
if isinstance(entity, ndb.Model):
self.ndb = True
self.query = self.model_class.query() # prepare the query to get all the entities
self.makePage = self._pager(self.ndbPager) # wrap the ndb pager
elif isinstance(entity, db.Model):
self.ndb = False
self.query = self.model_class.all()
self.makePage = self._pager(self.dbPager) # wrap the db pager
else :
raise ValueError('Failed to classify entities of kind : ' + str(self.kind))
logging.info('Entities of kind : %s inherits from class : %s.Model'
%(self.kind, self.ndb * 'ndb' + (not self.ndb) * 'db'))
self.data_types = {} # create a dict of property data types
for key in self.model_class._properties : # the internals of the model_class object
property_object = getattr(self.model_class, key.split('.')[0]) # strip, so it works for repeated structured properties
self.data_types[key] = property_object.__class__.__name__ # get the property type
logging.debug(self.data_types)
上記のコードでは、dbまたはNDBのページャー(カーソルを使用したページ転送)をラップして、GAEappid間でエンティティを転送します。
プロパティに基づいて、モデルを転送するためにプロパティをエンコードおよびデコードできます。これを行うには、最初にを使用してエンティティのdictを作成しNDB : entity.to_dict() or db: entity.to_dict()
ます。そして、私は口述に鍵を追加します。これで、エンティティのプロパティをエンコードし、結果をピクルスにして、エンコードされたエンティティを転送できます。
data = pickle.dumps(entity_dict, 1)
encoded_entity = base64.b64encode(data)