无法删除 google-app-engine 中的 Datastore 实体
Can't delete Datastore entities in google-app-engine
我尝试以两种不同的方式删除所有数据存储实体,但出现错误:
尝试 1:
results = myDS().query().fetch()
for res in results:
res.delete()
尝试 2:
results = myDS().query().fetch()
ndb.delete_multi(results)
在这两种情况下都失败了,我得到了错误:
The server encountered an error and could not complete your request.
知道为什么吗?
在从您的查询中获得的 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)
我尝试以两种不同的方式删除所有数据存储实体,但出现错误:
尝试 1:
results = myDS().query().fetch()
for res in results:
res.delete()
尝试 2:
results = myDS().query().fetch()
ndb.delete_multi(results)
在这两种情况下都失败了,我得到了错误:
The server encountered an error and could not complete your request.
知道为什么吗?
在从您的查询中获得的 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)