在测试过程中上传测试数据之前,需要删除Datastore名称空间。使用和Python3。
我在Python3中使用App中的Datastore。出于测试目的,我编写了一个脚本,使用将几个不同类型的实体上传到数据存储。由于这是一个小项目,目前只有4种,每种只有2-3个实体。
我想在管道中添加一个脚本来删除数据存储中包含我的测试数据的特定名称空间。我希望在数据上传和测试之前运行,这样每次测试都可以从一个干净的板子开始。在部署到app引擎之前,我使用云构建器将实体上传到数据存储,并在docker容器中运行测试。
目前,我能找到的唯一解决方案是使用Dataflow (我认为这完全是过分的),或者单独使用它的关键删除每个实体。如果可能的话,我宁愿直接删除整个命名空间。
如果有人对如何做到这一点有任何建议或建议,请告诉我!
发布于 2019-02-20 10:42:04
您可以用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中大约24小时是可见的,如果之后它不包含任何类型,它将被自动删除。
希望这能回答你的问题!!
发布于 2020-02-24 18:57:33
对于Python3中的App,您应该使用用于Python的Google客户端库
您还必须为管道设置数据存储身份验证。关于如何添加https://cloud.google.com/datastore/docs/reference/libraries环境变量,请参见GOOGLE_APPLICATION_CREDENTIALS。
删除所有测试数据的步骤
导入数据存储库
from google.cloud import datastore创建数据存储客户端
ds_client = datastore.Client()从测试数据中查询所有实体
query = ds_client.query(kind="Testdata")从查询提取创建一个列表
entities = list(query.fetch())现在您可以循环遍历列表并删除所有数据:
for entity in entities:
ds_client.delete(entity.key)下面是一个完整的示例,该示例创建一些测试数据,然后从测试数据命名空间中删除所有实体:
from google.cloud import datastore
def create_some_test_data():
"""Function for Creating Test data"""
kind = 'Testdata'
number_of_entities = 10
ds_client = datastore.Client()
print('-- Creating test data --')
for i in range(number_of_entities):
key = ds_client.key(kind)
entity = datastore.Entity(key=key)
entity.update({'test_data': i})
ds_client.put(entity)
print('Creating entity: {}'.format(entity))
def delete_all_test_data():
"""Function for Deleting all the Test data"""
kind = 'Testdata'
ds_client = datastore.Client()
fetch_limit = 100
print('-- Deleting all entities --')
entities = True
while entities:
query = ds_client.query(kind=kind)
entities = list(query.fetch(limit=fetch_limit))
for entity in entities:
print('Deleting: {}'.format(entity))
ds_client.delete(entity.key)
# Execute the functions
create_some_test_data()
delete_all_test_data()运行该示例应该输出如下所示:
-- Creating test data --
Creating entity: <Entity('Testdata', 5664747265458176) {'test_data': 0}>
Creating entity: <Entity('Testdata', 5723707007827968) {'test_data': 1}>
Creating entity: <Entity('Testdata', 5748214695198720) {'test_data': 2}>
Creating entity: <Entity('Testdata', 5683780991844352) {'test_data': 3}>
Creating entity: <Entity('Testdata', 5742950029983744) {'test_data': 4}>
Creating entity: <Entity('Testdata', 5716561121771520) {'test_data': 5}>
Creating entity: <Entity('Testdata', 5148025362055168) {'test_data': 6}>
Creating entity: <Entity('Testdata', 5729450050191360) {'test_data': 7}>
Creating entity: <Entity('Testdata', 5079111831650304) {'test_data': 8}>
Creating entity: <Entity('Testdata', 5681150794137600) {'test_data': 9}>
-- Deleting all entittes --
Deleting: <Entity('Testdata', 5079111831650304) {'test_data': 8}>
Deleting: <Entity('Testdata', 5148025362055168) {'test_data': 6}>
Deleting: <Entity('Testdata', 5664747265458176) {'test_data': 0}>
Deleting: <Entity('Testdata', 5681150794137600) {'test_data': 9}>
Deleting: <Entity('Testdata', 5683780991844352) {'test_data': 3}>
Deleting: <Entity('Testdata', 5716561121771520) {'test_data': 5}>
Deleting: <Entity('Testdata', 5723707007827968) {'test_data': 1}>
Deleting: <Entity('Testdata', 5729450050191360) {'test_data': 7}>
Deleting: <Entity('Testdata', 5742950029983744) {'test_data': 4}>
Deleting: <Entity('Testdata', 5748214695198720) {'test_data': 2}>发布于 2019-02-20 14:50:24
您应该能够使用与应用程序相同的Cloud,它甚至可以在Google之外使用(参见我如何使用谷歌数据存储在我的网络应用程序,不是托管在谷歌应用引擎?)。这个答案仅仅是基于文档,我并没有真正尝试过。
你需要做一些这样的事情:
https://stackoverflow.com/questions/54764032
复制相似问题