【问题标题】:How can I delete a Riak bucket in Python?如何在 Python 中删除 Riak 存储桶?
【发布时间】:2013-01-25 23:03:06
【问题描述】:

我想删除一个 Riak 存储桶,以便从我的系统中清除旧数据。我知道没有一个 Riak API 可以做到这一点,而是一个 deletes all the keys in the bucket,它可以有效地删除它。 Riak 确实提供了一个 API 来获取所有密钥,所以这相当简单。

我找到了一些 code online 来执行此操作,但它是用 JavaScript 编写并在 Node.js 下运行的。我想要一些 Python 的东西。这可能是一件简单的事情。有人有例子吗?

【问题讨论】:

    标签: python riak


    【解决方案1】:

    就像我在问题中所说的那样,我认为这很简单,尤其是使用 requests 库时,所以我开发了一个脚本来执行此操作。我从 Riak keys=true(即非分块)mode 开始,但在我更大的存储桶上失败了。我切换到分块模式(keys=stream),但输出不再是单个 JSON 对象,而是一系列连接的对象(即{...}{...}...{...}。一位同事为我提供了一个正则表达式,用于将 JSON 对象从聚合中拆分出来Riak 响应,我按顺序解析和处理。还不错。代码如下:

    #!/usr/bin/python
    # script to delete all keys in a Riak bucket
    
    import json
    import re
    import requests
    import sys
    
    def processChunk(chunk):
        global key_count
        obj = json.loads(chunk.group(2))
        if 'keys' in obj:
            for key in obj['keys']:
                r = requests.delete(sys.argv[1] + '/' + key)
                print 'delete key', key, 'response', r.status_code
                key_count += 1
    
    
    if len(sys.argv) != 2:
        print 'Usage: {0} <http://riak_host:8098/riak/bucket_name>'.format(sys.argv[0])
        print 'Set riak_host and bucket_name appropriately for your Riak cluster.'
        exit(0)
    
    r = requests.get(sys.argv[1] + '?keys=stream')
    content = ''
    key_count = 0
    
    for chunk in r.iter_content():
        if chunk:
            content += chunk
    
    re.sub(r'(?=(^|})({.*?})(?={|$))', processChunk, content)
    
    print 'Deleted', key_count, 'keys'
    

    虽然我的问题在这一点上已基本解决,但我怀疑还有更好的解决方案。我欢迎人们在此页面上添加它们。除非几周后没有提供替代方案,否则我不会接受我自己的答案。

    【讨论】:

    【解决方案2】:

    如果您可以选择使用 python riak-client,这可以用更少的代码来实现:

    #!/usr/bin/python
    import riak
    
    riak_handle = riak.RiakClient(pb_port=8087, protocol='pbc')
    riak_bucket = riak_handle.bucket('default')
    
    for keys in riak_bucket.stream_keys():
        for key in keys:
            print('Deleting %s' % key)
            riak_bucket.delete(key)
    

    如果这是您的主要用例,您可以调整它以使用参数。

    【讨论】:

    • 有趣的方法。感谢您添加它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多