如何在Python中删除Riak存储桶?

如何在Python中删除Riak存储桶?,python,riak,Python,Riak,我想删除Riak存储桶,以便从系统中清除旧数据。我知道没有一个RIAKAPI可以做到这一点,而是有一个可以有效删除它的RIAKAPI。Riak确实提供了一个API来获取所有密钥,因此这相当简单 我发现有一些方法可以做到这一点,但它是用JavaScript编写的,并在Node下运行。我想要Python的东西。这可能是一件简单的事情。有人有任何例子吗?正如我在问题中所说,我认为这非常简单,特别是对于库,所以我开发了一个脚本来实现这一点。我从Riakkeys=true(即非分块)开始,但在我较大的存储

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


我发现有一些方法可以做到这一点,但它是用JavaScript编写的,并在Node下运行。我想要Python的东西。这可能是一件简单的事情。有人有任何例子吗?

正如我在问题中所说,我认为这非常简单,特别是对于库,所以我开发了一个脚本来实现这一点。我从Riak
keys=true
(即非分块)开始,但在我较大的存储桶上失败了。我切换到分块模式(
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'
!/usr/bin/python
#删除Riak存储桶中所有密钥的脚本
导入json
进口稀土
导入请求
导入系统
def processChunk(块):
全局密钥计数
obj=json.load(chunk.group(2))
如果obj中有“键”:
对于obj中的键[“键”]:
r=requests.delete(sys.argv[1]+'/'+键)
打印“删除键”、“键”、“响应”、r.status\U代码
键计数+=1
如果len(sys.argv)!=2:
打印“用法:{0}”。格式(sys.argv[0])
打印“为您的riak集群适当设置riak_主机和bucket_名称”
出口(0)
r=requests.get(sys.argv[1]+'?keys=stream')
内容=“”
键计数=0
对于r.iter_content()中的块:
如果区块:
内容+=块
re.sub(r'(?=(^ |})({.*?})(?={|$)'),进程块,内容)
打印“已删除”,键数,“键”

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

如果使用python riak客户端是您的一个选择,那么可以用更少的代码实现这一点:

#!/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)

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

我们在PHP for Riak管理控制台中也采用了同样有趣的方法。感谢您添加它。