假如说:
- 你正在使用
ndb
library
- 你有一个
models.py
包含实体模型的文件
然后你可以尝试这样的事情,连接到应用程序的处理程序之一:
from google.appengine.ext import ndb
import inspect
import models
for kind, model in inspect.getmembers(models):
if not isinstance(model, ndb.model.MetaModel):
continue
cursor = None
while True:
keys, next_cursor, more = \
model.query().fetch_page(500, keys_only=True, start_cursor=cursor)
if keys:
ndb.delete_multi_async(keys)
if more and next_cursor:
cursor = next_cursor
else:
break
如果你有很多实体,上面的实体可能会在一段时间后被杀死DeadlineExceededError
(在它应该删除一堆实体之后)。要么你重复这个请求,直到他们全部消失。
或者甚至可以尝试将工作分配给延迟的任务,及时交错,以免有太多同时发生的请求,从而导致实例爆炸。像这样的事情:
from google.appengine.ext import deferred
from google.appengine.ext import ndb
import inspect
import models
def delete_keys(keys):
ndb.delete_multi(keys)
delay = 0
for kind, model in inspect.getmembers(models):
if not isinstance(model, ndb.model.MetaModel):
continue
cursor = None
while True:
keys, next_cursor, more = \
model.query().fetch_page(500, keys_only=True, start_cursor=cursor)
if keys:
deferred.defer(delete_keys, keys, _countdown=delay)
delay += 5
if more and next_cursor:
cursor = next_cursor
else:
break