我尝试以两种不同的方式删除所有数据存储区实体,但出现错误:
尝试1:
results = myDS().query().fetch()
for res in results:
res.delete()
尝试2:
results = myDS().query().fetch()
ndb.delete_multi(results)
在这两种情况下都失败了,我收到了错误:
服务器遇到错误,无法完成您的请求。
知道为什么吗?
答案 0 :(得分:0)
在从您的查询中获得的results
中,您拥有实际的实体。
在第一次尝试中,要删除实体,您需要在实体的密钥上调用.delete()
,而不是在实体本身,请参阅Deleting entities:
res.key.delete()
同样,在第二次尝试中,您需要将实体密钥而非实体传递给ndb.delete_multi()
,另请参阅Using batch operations:
ndb.delete_multi([r.key for r in results])
但在这两种情况下,直接从查询中获取实体密钥效率更高(您实际上并不需要实体本身来删除它们)。由于您正在跳过数据存储区读取操作,因此它也更便宜。你的尝试看起来像这样:
keys = myDS().query().fetch(keys_only=True)
for key in keys:
key.delete()
keys = myDS().query().fetch(keys_only=True, limit=500) # up to 500 keys at a time
ndb.delete_multi(keys)