在应用引擎数据存储区中查找重复项

时间:2011-01-25 21:10:47

标签: database google-app-engine duplicates

我的数据存储区中有一些重复的元素(不是整行,但是它上面的大多数字段)在App Engine中。

找到它们的最佳方式是什么?

我有重复的整数和字符串字段(如果比较一个比另一个快)。

谢谢!

2 个答案:

答案 0 :(得分:6)

一种愚蠢但快速的方法是获取你关心的字段,将它们连接成一个长字符串,并将它们存储为引用原始实体的DB_Unique实体的键。每次执行DB_Unique.get_or_insert()时,您应该验证引用是否是正确的原始实体,否则,您有重复。这可能应该在map reduce

中完成

类似的东西:

class DB_Unique(db.Model):
  r = db.ReferenceProperty()

class DB_Obj(db.Model):
  a = db.IntegerProperty()
  b = db.StringProperty()
  c = db.StringProperty()

# executed for each DB_Obj...
def mapreduce(entity):
  key = '%s_%s_%s' % (entity.a,entity.b,entity.c)
  res = DB_Unique.get_or_insert(key, r=entity)
  if DB_Unique.r.get_value_for_datastore(res) != entity.key():
    # we have a possible collision, verify and delete?
    # out two entities are res and entity

有一些边缘情况可能会蔓延,例如,如果你有两个实体,其中b和c分别等于('a_b','')和('a','b_'),所以对于两者,连接都是'a_b_'。因此,请使用您知道不在字符串中的字符而不是“_”,或者让DB_Unique.r成为引用列表并比较所有字符。

答案 1 :(得分:1)

如果这是一次或很少发生的情况,您可能想尝试将整个数据库转储到本地计算机 - 请参阅uploading and downloading data - 将数据加载到sqlite3数据库并找到包含重复键的数据。 / p>

尝试在GAE方面以编程方式执行此操作可能会非常繁琐。 任务完全可行,但不是太容易。