AttributeError: 'Key' object has no attribute 'delete'
AttributeError: 'Key' object has no attribute 'delete'
我正在尝试使用下面定义的函数 findpins
从我的数据存储中删除一批单一种类的实体。参数 limit
指示要删除的 Kind Pin
中的实体数。
实际上,limit
将略低于 20000,以使每日删除免费。我正在执行 keys_only
查询以避免读取每个实体。
但是在测试我的代码时出现以下错误。
AttributeError: 'Key' object has no attribute 'delete'
更新 0
如果我使用 print pin
而不是 pin.delete()
,我会看到两个 80 个字符的字符串,我认为它们是 2 个键。但是我不知道如何使用Keys进行删除。
更新 1
如果我使用 keys_only=False
而不是 keys_only=True
,我将完成删除。但后来我遇到了一个潜在的读取费用,这是昂贵的。对吗?
我该如何解决这个问题?
如果您发现我的策略存在其他问题,也请指出。
更新 2 我根据 @jccampanero 的建议修改的 Python 代码很有前途,但由于其参数 Model
目前在 isinstance
中失败] 和 Key
。首先我收到错误消息 NameError: global name 'Model' is not defined
。但是当我用 Pin
替换 Model
时,我得到错误 NameError: global name 'Key' is not defined
并且我无法想象用什么替换 Key
。我不知道我在用这些新定义做什么,而且我对参数 **kwargs
特别不舒服。所以我真的可以在这里使用一些帮助。我在正确的轨道上吗?
Python 代码(编辑了 2 个新导入、2 个新定义和 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)
根据库的源代码,您可以为此目的使用 delete
函数:它接受要删除的记录的键。
请考虑在您的代码中进行以下修改(注意上述 db.delete
函数的使用):
import os
import pprint
from google.appengine.ext import db
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):
db.delete(pin)
findpins(2)
我正在尝试使用下面定义的函数 findpins
从我的数据存储中删除一批单一种类的实体。参数 limit
指示要删除的 Kind Pin
中的实体数。
实际上,limit
将略低于 20000,以使每日删除免费。我正在执行 keys_only
查询以避免读取每个实体。
但是在测试我的代码时出现以下错误。
AttributeError: 'Key' object has no attribute 'delete'
更新 0
如果我使用 print pin
而不是 pin.delete()
,我会看到两个 80 个字符的字符串,我认为它们是 2 个键。但是我不知道如何使用Keys进行删除。
更新 1
如果我使用 keys_only=False
而不是 keys_only=True
,我将完成删除。但后来我遇到了一个潜在的读取费用,这是昂贵的。对吗?
我该如何解决这个问题?
如果您发现我的策略存在其他问题,也请指出。
更新 2 我根据 @jccampanero 的建议修改的 Python 代码很有前途,但由于其参数 Model
目前在 isinstance
中失败] 和 Key
。首先我收到错误消息 NameError: global name 'Model' is not defined
。但是当我用 Pin
替换 Model
时,我得到错误 NameError: global name 'Key' is not defined
并且我无法想象用什么替换 Key
。我不知道我在用这些新定义做什么,而且我对参数 **kwargs
特别不舒服。所以我真的可以在这里使用一些帮助。我在正确的轨道上吗?
Python 代码(编辑了 2 个新导入、2 个新定义和 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)
根据库的源代码,您可以为此目的使用 delete
函数:它接受要删除的记录的键。
请考虑在您的代码中进行以下修改(注意上述 db.delete
函数的使用):
import os
import pprint
from google.appengine.ext import db
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):
db.delete(pin)
findpins(2)