我正在尝试将此前db游标code snippet复制到ndb中。 (向下滚动到Updating Existing Entities
)
我有2700条记录。这个游标背后的想法是遍历所有记录并使用不同的密钥创建新记录。我需要一个开始时的快照,因为我不希望新创建的记录再次显示在光标中。
换句话说,光标应该只迭代2700个初始记录。我试图传递光标,但它不起作用。我最后得到了8500条记录。我期待2700 x 2 = 5400.所以它在某种程度上无法正常工作。
BATCH_SIZE = 100 # ideal batch size may vary based on entity size.
def updateRecordSchema(cursor=None, num_updated=0):
query = Record.query()
records, cursor, more = query.fetch_page(BATCH_SIZE, start_cursor=cursor)
to_put = []
to_delete = []
for record in records:
new_record = Record(parent = record.user,
user = record.user,
record_date = record.record_date)
to_put.append(new_record)
to_delete.append(record)
if to_put:
ndb.put_multi(to_put)
num_updated += len(to_put)
logging.debug('Put %d entities to Datastore for a total of %d', len(to_put), num_updated)
deferred.defer(updateRecordSchema, cursor=cursor, num_updated=num_updated)
else:
logging.debug('UpdateSchema complete with %d updates!', num_updated)
答案 0 :(得分:1)
这里的问题不是db vs ndb:使用db运行此代码会遇到完全相同的问题。这是因为您正在添加新实体,而不像文档中仅修改现有实体的版本。由于查询没有排序,它默认为键顺序,因此一些新实体将位于光标位置之前,因此在将来的运行中返回(新键随机分配,因此并非所有实体都在前面)。
最好的办法是在last_updated字段上添加过滤器,如果模型中有一个过滤器,或者可以用来区分旧记录和新记录的其他字段。