我的数据存储区中有一些重复的元素(不是整行,但是它上面的大多数字段)在App Engine中。
找到它们的最佳方式是什么?
我有重复的整数和字符串字段(如果比较一个比另一个快)。
谢谢!
答案 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方面以编程方式执行此操作可能会非常繁琐。 任务完全可行,但不是太容易。