首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过bulkloader.Loader覆盖现有实体

通过bulkloader.Loader覆盖现有实体
EN

Stack Overflow用户
提问于 2010-02-25 08:29:06
回答 1查看 781关注 0票数 1

我打算使用app引擎为大数据进行基于CSV的导出/导入。我的想法很简单。

  • CSV的第一栏将是实体的关键。
  • 如果它不是空的,那么该行表示现有的实体,应该覆盖旧的实体。
  • 否则,该行是新实体,应该创建新实体。

通过添加密钥属性,可以导出实体的密钥。

代码语言:javascript
复制
class FrontExporter(bulkloader.Exporter):
    def __init__(self):
        bulkloader.Exporter.__init__(self, 'Front', [
        ('__key__', str, None),
        ('name', str, None),
        ])

但是当我试图上传CSV时,它失败了,因为bulkloader.Loader.generate_key()只是为了"key_name“而不是"key”本身。这意味着所有导出实体在CSV应该有唯一的'key_name‘,如果我想修改和重新上传他们。

代码语言:javascript
复制
class FrontLoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'Front', [
        ('_UNUSED', lambda x: None),
        ('name', lambda x: x.decode('utf-8')),
        ])
    def generate_key(self,i,values):
        # first column is key
        keystr = values[0]
        if len(keystr)==0:
            return None
        return keystr

我还试图在不使用generate_key()的情况下直接加载密钥,但都失败了。

代码语言:javascript
复制
class FrontLoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'Front', [
        ('Key', db.Key), # not working. just create new one. 
        ('__key__', db.Key), # same...

那么,如何覆盖没有“key_name”的现有实体呢?如果我给所有的实体取一个独特的名字,那就太可怕了.

从第一个答案开始,我就能处理这个问题。:)

代码语言:javascript
复制
def create_entity(self, values, key_name=None, parent=None):
  # if key_name is None:
  #     print 'key_name is None'
  # else:
  #     print 'key_name=<',key_name,'> : length=',len(key_name)
  Validate(values, (list, tuple))
  assert len(values) == len(self._Loader__properties), (
      'Expected %d columns, found %d.' %
      (len(self._Loader__properties), len(values)))

  model_class = GetImplementationClass(self.kind)

  properties = {
      'key_name': key_name,
      'parent': parent,
      }
  for (name, converter), val in zip(self._Loader__properties, values):
    if converter is bool and val.lower() in ('0', 'false', 'no'):
      val = False
    properties[name] = converter(val)

  if key_name is None:
      entity = model_class(**properties)
      #print 'create new one'
  else:
      entity = model_class.get(key_name)
      for key, value in properties.items():
          setattr(entity, key, value)
      #print 'overwrite old one'
  entities = self.handle_entity(entity)

  if entities:
    if not isinstance(entities, (list, tuple)):
      entities = [entities]

    for entity in entities:
      if not isinstance(entity, db.Model):
        raise TypeError('Expected a db.Model, received %s (a %s).' %
                        (entity, entity.__class__))

  return entities

def generate_key(self,i,values):
    # first column is key
    if values[0] is None or values[0] in ('',' ','-','.'):
        return None
    return values[0]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-25 09:57:55

您最好的选择可能是重写实体。您需要在那里复制大部分现有代码,但是修改构造函数以提供key参数,而不是key_name参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2332604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档