如何在 python 中使用 NDB 查询从数据存储中删除数据?

How to delete data from datastore using NDB query in python?

我有这样的数据:

{
  "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 的新手。

嗯,你不是 "building" 正确的钥匙。密钥应使用实体种类及其 ID/name(如果您知道)来构建。来自 Specifying your own key name:

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/name。

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

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

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

    "id": "aghkZXZ-Tm9uZXIZCxIMUXVlcnlIaXN0b3J5GICAgICAyOsKDA"

  • 有一个看起来像数据存储的 nidauto-generated numeric key 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() 会更有效,请参阅 Deleting entities in bulk