Python 2.7 NDB-删除密钥列表的最有效方法
我认为我需要使用Python 2.7 NDB-删除密钥列表的最有效方法,python-2.7,google-app-engine,google-cloud-datastore,app-engine-ndb,Python 2.7,Google App Engine,Google Cloud Datastore,App Engine Ndb,我认为我需要使用ndb.delete\u multi,但我不知道如何使它适用于一组特定的键,以及它是否是最有效的方法。将Python 2.7与Google应用程序引擎结合使用 首先,我正在收集要删除的密钥。我不想删除所有内容,只想删除那些1小时或更长时间的条目。为此,我首先收集满足此标准的密钥列表 cs = ChannelStore() delMsgKeys = [] for x in cs.allMessages(): current = datetime.datetime.now()
ndb.delete\u multi
,但我不知道如何使它适用于一组特定的键,以及它是否是最有效的方法。将Python 2.7与Google应用程序引擎结合使用
首先,我正在收集要删除的密钥。我不想删除所有内容,只想删除那些1小时或更长时间的条目。为此,我首先收集满足此标准的密钥列表
cs = ChannelStore()
delMsgKeys = []
for x in cs.allMessages():
current = datetime.datetime.now()
recordTime = x.channelMessageCreated
timeDiffSecs = (current - recordTime).total_seconds()
timeDiff = (timeDiffSecs/60)/60
if timeDiff >=1:
delMsgKeys.append(x.key.id())
ndb.delete_multi(?????)
cs.allMessages()的定义:
首先,总体而言,这是最有效的方法吗?其次,如何使用我用ndb.delete\u multi
语句创建的键列表
---更新----
ndb.delete_multi的问题与我传递的密钥有关。在我贴在上面的代码中,密钥应存储如下:
delMsgKeys.append(x.key)
使用上述ndb.delete_multi works 根据,您只需将密钥列表传递给ndb.delete\u multi,因此根据您的代码,这应该可以:
ndb.delete_multi(delMsgKeys)
我不确定在单个ndb.delete\u multi()
调用中可以传递的密钥数的限制是多少
对于此查询:
ChannelStore.query().fetch()
通过添加auto_now=True
(),可以添加实体属性以在创建/更新实体时存储时间戳。然后使用timestamp
属性,您可以查询如下内容:
sixty_mins_ago = datetime.datetime.now()- datetime.timedelta(minutes = 60)
qry = ChannelStore.query()
list_of_keys = qry.filter(ChannelStore.timestamp < sixty_mins_ago).fetch(keys_only = True)
class ChannelStore(ndb.model):
#other properties go here
timestamp = ndb.DateTimeProperty(auto_now = True)
综上所述,类似这样的东西可能适用于上面的代码块:
from models import ChannelStore
from google.appengine.ext import ndb
from datetime import datetime, timedelta
# other imports
def delete_old_entities():
sixty_mins_ago = datetime.now() - timedelta(minutes = 60)
qry = ChannelStore.query()
qry = qry.filter(ChannelStore.timestamp < sixty_mins_ago)
list_of_keys = qry.fetch(keys_only = True)
ndb.delete_multi(list_of_keys)
谢谢你的回复。在我进入时间部分之前,我想对ndb.delete_multi进行评论。我看了他们的文件,和你一样,我觉得我所要做的就是把钥匙递给他们。然而,它给出了一个错误。基本上,错误可以归结为以下几行:“AttributeError:‘long’对象没有属性‘delete_async’”。我发现了delete_multi的部分问题。我只需要传递“密钥”,而不是“密钥id”。我将在上面发布更新。我确实存储了datetimeproperty。我确实看到了您对代码的建议,但我不确定它是否保存了任何内容。我仍在进行查询,然后返回ndb.delete\u multi。你看到你发布的代码比我发布的代码效率提高了吗?我认为让事情更高效(更便宜,真的)的最大的事情是你在代码中获取整个实体,而
keys\u only
fetch会更便宜。您不需要整个实体来删除它,但是您将为所有这些数据存储读取付费,而只需要keys\u
查询。此外,您的代码会获取每个实体,稍后您会手动进行筛选,而我认为在开始时只获取具有特定筛选器的实体会更快。另外,您可以对是否在之前或之后进行筛选的步骤进行计时,然后看出区别——我猜这不会有什么意义。在任何情况下,您都应该执行一个仅限keys_的查询以节省资金。请尝试appstats查看任何差异,特别是RPC调用,这通常是应用程序引擎应用程序中的速率限制步骤。
from models import ChannelStore
from google.appengine.ext import ndb
from datetime import datetime, timedelta
# other imports
def delete_old_entities():
sixty_mins_ago = datetime.now() - timedelta(minutes = 60)
qry = ChannelStore.query()
qry = qry.filter(ChannelStore.timestamp < sixty_mins_ago)
list_of_keys = qry.fetch(keys_only = True)
ndb.delete_multi(list_of_keys)
def delete_old_entities():
sixty_mins_ago = datetime.datetime.now() - datetime.timedelta(minutes = 60)
qry = ChannelStore.query()
qry = qry.filter(ChannelStore.timestamp < sixty_mins_ago)
list_of_keys = qry.fetch(keys_only = True)
while list_of_keys:
# delete 100 at a time
ndb.delete_multi(list_of_keys[:100])
list_of_keys = list_of_keys[100:]