【问题标题】:Delete entity from Datastore by ID/ancestry按 ID/祖先从 Datastore 中删除实体
【发布时间】:2013-06-17 12:25:23
【问题描述】:

我已经尝试从 GAE 数据存储中删除一个实体已有数小时了,但它无法正常工作。我几乎和how to delete NDB entity using ID?做了同样的事情,但是我确定问题出在祖先关系上。

这是相关的代码:

try:
 ndb.Key('NewsBase', int(self.request.get('delid'))).delete()

当我打印出ndb.Key (self.request.out.write...) 时,我会得到类似Key('NewsBase', 8008) 的信息,这是正确的 ID(已在数据存储中检查)。在仪表板中,我还获得了“已解码实体密钥”,即

NewsBase: name=mynews > NewsBase: id=8001

我对如何包含祖先信息有点困惑,但据我所知Using Key in NDB to retrieve an entity我根本不需要它,或者我不需要它吗?

编辑:我如何创建密钥

def news_key(base_name='mynews'):
    return ndb.Key('NewsBase', base_name)

    t = NewsBase(parent=news_key('mynews'))
    t.user = user
    t.put()

【问题讨论】:

  • 您是否正在尝试创建一个结构,其中NewsBase 实体将成为更多NewsBase 实体的父级?你确定你不是故意的吗t = NewsBase(key=news_key('finagnews'))?

标签: python google-app-engine


【解决方案1】:

您需要完整的密钥,包括祖先(如果有的话)。这是因为子 ID 本身不一定是唯一的:只有完整路径是唯一的,因此您需要它来识别特定实体。

在你的情况下,你可能只想要nb.Key('NewsBase', 'mynews', 'NewsBase', 8001)。

(不过,我怀疑您一开始就在做一些奇怪的事情来创建您的密钥:拥有与孩子的数字 ID 具有相同类型的名称密钥的祖先是不寻常的。)

【讨论】:

  • 它仍然没有删除它 - 我按照入门指南中的描述创建了密钥,请参阅上面的编辑。有什么想法可能是错的吗?
  • 这显然不是您创建密钥的完整代码,否则一切都会被称为mynews。你怎么称呼那个代码?另外,当您说“它不会删除它”时,实际上会发生什么?你有错误吗?如果有,是什么?
  • 完全没有错误,我想它没有找到任何东西,因此只是跳过它。包括函数调用。谢谢丹尼尔。
【解决方案2】:

尝试使用 urlsafe 版本的密钥而不是 ID:

将密钥输出为:

key.urlsafe() 而不是key.id()

并在您的请求处理程序中将其删除为:

ndb.Key(urlsafe=self.request.get('delkey')).delete()

urlsafe 版本的密钥将包含所有必要的祖先信息。

另外,您的news_key 函数是否知道它创建的密钥存在?您不应该为不存在的实体存储具有父键的实体。

你的 news_key 应该更像:

 def news_key(base_name='mynews'):
    return NewsBase.get_or_insert(id=base_name).key

仅供参考 - 删除父级并不会删除所有子级。此外,按照您在此处显示的方式,您的 NewsBase 实体的父级将是另一个 NewsBase 实体。

【讨论】:

  • 好消息是:key.urlsafe 实际上给了我密钥(不是 Key('NewsBase', id))。但它仍然没有删除实体。知道如何调试吗?
  • 其次:为什么新手会这样做(ndb.Key 而不是 NewsBase.get_or_insert)?
  • get_or_insert 将确保存在具有您提供的 ID 的实体。不确定您使用的是什么入门指南,但我无法想象它会引导您按照自己的方式做事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2018-08-24
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多