【问题标题】:AttributeError: 'Key' object has no attribute 'delete'AttributeError:“键”对象没有属性“删除”
【发布时间】: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 中失败了,因为它的参数 ModelKey。首先我收到错误消息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.Modeldb.Key 工作。而且我必须定义_coerce_to_key,这也在您建议的链接中给出。 _coerce_to_key 还需要修复 db.Modeldb.Key。顺便说一句,from db import Model, Key 会引发错误。我没有检查没有读操作,但我怀疑没有。

标签: python google-app-engine google-cloud-platform google-cloud-datastore


【解决方案1】:

根据库的源代码,您可以使用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)

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2021-07-21
    • 2019-12-17
    相关资源
    最近更新 更多