Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 NDB-删除密钥列表的最有效方法_Python 2.7_Google App Engine_Google Cloud Datastore_App Engine Ndb - Fatal编程技术网

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:]