光标如何在ndb中工作?

时间:2014-01-31 12:33:37

标签: python google-app-engine cursor app-engine-ndb

我正在尝试将此前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)

1 个答案:

答案 0 :(得分:1)

这里的问题不是db vs ndb:使用db运行此代码会遇到完全相同的问题。这是因为您正在添加新实体,而不像文档中仅修改现有实体的版本。由于查询没有排序,它默认为键顺序,因此一些新实体将位于光标位置之前,因此在将来的运行中返回(新键随机分配,因此并非所有实体都在前面)。

最好的办法是在last_updated字段上添加过滤器,如果模型中有一个过滤器,或者可以用来区分旧记录和新记录的其他字段。