首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法可以使用Python3 (没有数据流)从数据存储命名空间中删除所有实体?

是否有一种方法可以使用Python3 (没有数据流)从数据存储命名空间中删除所有实体?
EN

Stack Overflow用户
提问于 2019-02-19 10:28:23
回答 3查看 2.6K关注 0票数 1

在测试过程中上传测试数据之前,需要删除Datastore名称空间。使用和Python3。

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

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

目前,我能找到的唯一解决方案是使用Dataflow (我认为这完全是过分的),或者单独使用它的关键删除每个实体。如果可能的话,我宁愿直接删除整个命名空间。

如果有人对如何做到这一点有任何建议或建议,请告诉我!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-20 10:42:04

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

代码语言:javascript
复制
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小时是可见的,如果之后它不包含任何类型,它将被自动删除。

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

票数 1
EN

Stack Overflow用户

发布于 2020-02-24 18:57:33

对于Python3中的App,您应该使用用于Python的Google客户端库

您还必须为管道设置数据存储身份验证。关于如何添加https://cloud.google.com/datastore/docs/reference/libraries环境变量,请参见GOOGLE_APPLICATION_CREDENTIALS。

删除所有测试数据的步骤

导入数据存储库

代码语言:javascript
复制
from google.cloud import datastore

创建数据存储客户端

代码语言:javascript
复制
ds_client = datastore.Client()

从测试数据中查询所有实体

代码语言:javascript
复制
query = ds_client.query(kind="Testdata")

从查询提取创建一个列表

代码语言:javascript
复制
entities = list(query.fetch())

现在您可以循环遍历列表并删除所有数据:

代码语言:javascript
复制
for entity in entities:
    ds_client.delete(entity.key)

下面是一个完整的示例,该示例创建一些测试数据,然后从测试数据命名空间中删除所有实体:

代码语言:javascript
复制
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()

运行该示例应该输出如下所示:

代码语言:javascript
复制
-- 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}>
票数 3
EN

Stack Overflow用户

发布于 2019-02-20 14:50:24

您应该能够使用与应用程序相同的Cloud,它甚至可以在Google之外使用(参见我如何使用谷歌数据存储在我的网络应用程序,不是托管在谷歌应用引擎?)。这个答案仅仅是基于文档,我并没有真正尝试过。

你需要做一些这样的事情:

  1. 在应用程序的数据存储中找到各种类型(可能只是在感兴趣的名称空间中?)这可以使用数据存储元数据,特别是善意查询: Client.query= entity.key.id_or_name (entity.key.id_or_name= query.fetch()中的实体)
  2. 查找每种类型的实体的键,使用常规键-只查询您现在知道的类型。将这些查询限制在感兴趣的名称空间内。在批处理模式下,按键删除实体,以提高效率: 种类: query = client.query(kind=kind,namespace=NAMESPACE) query.keys_only() keys = query.fetch() client.delete_multi(keys)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54764032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档