python - 有没有办法使用 Python3(没有数据流)从数据存储命名空间中删除所有实体?
问题描述
在测试期间上传测试数据之前,需要清除 Datastore 命名空间。将 Cloud Datastore API 与 Python3 结合使用。
我在 Python3 中将 Datastore 与 App Engine 一起使用。出于测试目的,我使用 Cloud Datastore API 编写了一个脚本,用于将多个不同类型的实体上传到数据存储区。由于这是一个小项目,目前只有 4 种,每种只有 2-3 个实体。
我想在我的管道中添加一个脚本,以清除 Datastore 中包含我的测试数据的特定命名空间。我希望它在上传数据和测试之前运行,这样测试每次都可以从头开始。我正在使用云构建器将实体上传到数据存储区,并在部署到应用引擎之前在 docker 容器中运行我的测试。
目前,我能找到的唯一解决方案是使用 Dataflow(我相信这完全是矫枉过正),或者使用它的密钥单独删除每个实体。如果可能的话,我宁愿只清除整个命名空间。
如果有人对如何执行此操作有任何建议或建议,请告诉我!
解决方案
您可以在 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 小时,如果之后它不包含任何种类,它将被自动删除。
希望这能回答你的问题!!
推荐阅读
- r - 有什么方法可以在ggplot中使用计数统计来注释多个箱线图?
- docker - 有没有办法使用 conda 或通过 tar 文件安装 Boto3?
- angular - 在 Nginx Ingress AKS 上设置 Angular 应用程序
- if-statement - 基于另一个字段在 Tableau 中的排名
- mysql - 如何在SQL中检查一个孩子的所有父记录的列值
- javascript - 格式良好的 JSON 文件
- css - 改变整个页面的颜色
- python - 程序不允许选择的数字输出运行
- windows - UAC 提示期间的鼠标控制 (SendInput)
- c# - 如何在 WPF 运行时更改 Listview 中的图像?