它只是编写了一个实用程序来将实体从一个应用程序复制到另一个应用程序并压缩一种实体。该实用程序会进行精确的克隆,包括键、NDB 重复属性、serving_urls 和类型中引用的 blob。为了完成这项工作,我必须知道实体的属性类型。我使用 Python 27 和 NDB,但该实用程序也传输 db.Models。
这是查找 kind 的所有属性类型的代码:
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 包装了一个寻呼机(使用游标进行分页传输),以在 GAE appid 之间传输实体。
基于这些属性,我可以对属性进行编码和解码以传输模型。为此,我首先使用创建实体的字典NDB : entity.to_dict() or db: entity.to_dict()
。我将密钥添加到字典中。现在我可以对实体的属性进行编码并腌制结果以传输编码的实体:
data = pickle.dumps(entity_dict, 1)
encoded_entity = base64.b64encode(data)