首页 > 解决方案 > 如何在 python 中使用 NDB 查询从数据存储中删除数据?

问题描述

我有这样的数据:

{
  "queryValue": "SELECT Name, Site, Phone, Type, Owner.Name, CreatedBy.profile.Name FROM Account",
  "SFDCUser_id": "0056F00000ALw6aQAD",
  "updated_at": "2018-11-18T07:26:24.954000",
  "id": "aghkZXZ-Tm9uZXIZCxIMUXVlcnlIaXN0b3J5GICAgICAyOsKDA",
  "is_error": false,
  "nid": 6102564412063744,
  "date": "2018-11-18T07:26:24.954000",
  "created_at": "2018-11-18T07:26:24.954000"
}

我正在使用 id 从数据存储区中删除特定记录。我的代码是这样的:

ndb.Key('id',id).delete()

但它不能正常工作,我是 python 新手。

标签: pythongoogle-app-enginegoogle-cloud-platformgoogle-cloud-datastoreapp-engine-ndb

解决方案


好吧,您没有正确“构建”密钥。应使用实体类型及其 ID/名称(如果您知道的话)来构建密钥。从指定您自己的密钥名称

account.key = ndb.Key('Account', 'sandy@example.com')

# You can also use the model class object itself, rather than its name,
# to specify the entity's kind: 
account.key = ndb.Key(Account, 'sandy@example.com')

但是该示例假定'sandy@example.com'在创建实体时将其指定为键的 ID/名称。

您显示的实体似乎属于Account那种(或至少是您所查询的),而不是id那种。所以你应该像引用的例子一样构建你的密钥(他们的实体类型也被命名为Account)。

此外,您的实体似乎没有使用指定的实体 ID:

  • 实体的id值看起来像一个键的urlsafe字符串:

    "id": "aghkZXZ-Tm9uZXIZCxIMUXVlcnlIaXN0b3J5GICAgICAyOsKDA"

  • 有一个nid看起来像数据存储区自动生成的数字键 ID的值:

    "nid": 6102564412063744

如果是这样,那么nid实际上是您的密钥 ID,因此您将像这样构建您的密钥:

ndb.Key(Account, nid)

您还可以使用:

ndb.Key(urlsafe=id)

但是如果你确实有实体,例如从查询结果来看,你不再需要构建它的键来执行删除,你可以直接从实体中获取键并删除它,如下所示:

for entity in ndb.query(...).fetch(...):
    entity.key.delete()

如果您要删除多个实体,使用起来会更高效ndb.delete_multi(),请参阅批量删除实体


推荐阅读