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