首页 > 解决方案 > 有没有办法使用 Python3(没有数据流)从数据存储命名空间中删除所有实体?

问题描述

在测试期间上传测试数据之前,需要清除 Datastore 命名空间。将 Cloud Datastore API 与 Python3 结合使用。

我在 Python3 中将 Datastore 与 App Engine 一起使用。出于测试目的,我使用 Cloud Datastore API 编写了一个脚本,用于将多个不同类型的实体上传到数据存储区。由于这是一个小项目,目前只有 4 种,每种只有 2-3 个实体。

我想在我的管道中添加一个脚本,以清除 Datastore 中包含我的测试数据的特定命名空间。我希望它在上传数据和测试之前运行,这样测试每次都可以从头开始。我正在使用云构建器将实体上传到数据存储区,并在部署到应用引擎之前在 docker 容器中运行我的测试。

目前,我能找到的唯一解决方案是使用 Dataflow(我相信这完全是矫枉过正),或者使用它的密钥单独删除每个实体。如果可能的话,我宁愿只清除整个命名空间。

如果有人对如何执行此操作有任何建议或建议,请告诉我!

标签: pythonpython-3.xgoogle-app-enginegoogle-cloud-platformgoogle-cloud-datastore

解决方案


您可以在 python 中编写脚本来删除特定命名空间中的所有种类。假设您事先知道种类的名称。

from google.appengine.ext import ndb
from google.appengine.api import namespace_manager

namespace = "PROVIDE_NAMESPACE_HERE"
kind_list = [kind_1,kind_2,kind_3,kind_4]

namespace_manager.set_namespace(namespace) # will set to the namespace provided

for a_kind in kind_list:
    # will fetch keys of all objects in that kind
    kind_keys = a_kind.gql("").fetch(keys_only = True) 
    # will delete all the keys at once
    ndb.delete_multi(kind_keys) 

从特定命名空间中删除所有种类后,您的命名空间将在 Cloud Datastore 中显示大约 24 小时,如果之后它不包含任何种类,它将被自动删除。

希望这能回答你的问题!!


推荐阅读