【发布时间】:2021-10-10 20:57:06
【问题描述】:
我正在尝试使用下面定义的函数findpins 从我的数据存储中删除一批单一种类的实体。参数limit 告诉类型Pin 中要删除的实体数量。
实际上,limit 将略低于 20000,以使每日删除免费。我正在执行keys_only 查询以避免读取每个实体。
但在测试我的代码时出现以下错误。
AttributeError: 'Key' 对象没有属性 'delete'
更新 0
如果我使用 print pin 而不是 pin.delete(),我会看到两个 80 个字符的字符串,我假设它们是 2 个键。但我不知道如何使用 Keys 进行删除。
更新 1
如果我使用keys_only=False 而不是keys_only=True,我会完成删除。但后来我遇到了潜在的阅读费用,这是昂贵的。对吗?
我该如何解决这个问题?
如果您发现我的策略存在其他问题,也请说出来。
更新 2 我根据 @jccampanero 的建议修改过的 Python 代码很有希望,但到目前为止在 isinstance 中失败了,因为它的参数 Model 和 Key。首先我收到错误消息NameError: global name 'Model' is not defined。但是当我用Pin 替换Model 时,我得到了错误NameError: global name 'Key' is not defined,我无法想象用什么替换Key。我不知道我在用这些新定义做什么,而且对参数**kwargs 特别不舒服。所以我真的可以在这里使用一些帮助。我在正确的轨道上吗?
Python 代码(用 2 个新的导入、2 个新的 def 和 1 个新的删除命令编辑):
import os
import pprint
from google.appengine.ext import db
from google.appengine.api import datastore
from google.appengine.datastore import datastore_rpc
def delete_async(models, **kwargs):
if isinstance(models, (basestring, Model, Key)):
models = [models]
else:
try:
models = iter(models)
except TypeError:
models = [models]
keys = [_coerce_to_key(v) for v in models]
return datastore.DeleteAsync(keys, **kwargs)
def delete(models, **kwargs):
delete_async(models, **kwargs).get_result()
class Pin(db.Model):
name = db.StringProperty()
def findpins(limit):
pin_query = Pin.all(keys_only=True)
for pin in pin_query.run(limit=limit):
# was: pin.delete()
delete(pin)
findpins(2)
【问题讨论】:
-
如果您有一个 minimal reproducible example 包含您的导入等,这可能会有所帮助。您正在使用哪些库(至少对我而言)并不明显。
-
是的,很抱歉。
from google.appengine.ext import db已添加。 -
我从来没有使用过这个库,但是根据它的源代码,请考虑使用
db-Pin- delete 函数。它将您要删除的记录的键作为参数。您只能在查询中获取键 (keys_only=True)。我希望它有所帮助。 -
@zerowords 根据您的编辑,请注意
Model类和变量Key都在db模块中定义,请在指定的源中搜索它们代码。您可以尝试在您的代码中导入它们,例如from db import Model, Key。也许您当然可以尝试from db import *,但我不知道从db模块导入所有符号是否会导致任何问题。也许您可以尝试在您的代码if isinstance(models, (basestring, db.Model, db.Key)):作为替代方案。 -
db.Model和db.Key工作。而且我必须定义_coerce_to_key,这也在您建议的链接中给出。_coerce_to_key还需要修复db.Model和db.Key。顺便说一句,from db import Model, Key会引发错误。我没有检查没有读操作,但我怀疑没有。
标签: python google-app-engine google-cloud-platform google-cloud-datastore