我想删除Riak存储桶以清除系统中的旧数据。我知道没有单一的Riak API可以做到这一点,而是有一个deletes all the keys in the bucket,它可以有效地删除它。 Riak确实提供了一个API来获取所有密钥,因此这非常简单。
我找到了一些code online来执行此操作,但它是用JavaScript编写的,并在Node下运行。我想要一些Python的东西。这可能是一件简单的事情。有没有人有任何例子?
答案 0 :(得分:11)
就像我在问题中所说的那样,我认为这很简单,特别是对于requests库,所以我开发了一个脚本来执行此操作。我开始使用Riak keys=true
(即非分块)mode,但是在我较大的桶上失败了。我切换到chunked模式(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'
虽然我的问题在很大程度上解决了,但我怀疑有更好的解决方案。我欢迎人们在这个页面上添加它们。除非在几周后没有提供替代方案,否则我不会接受我自己的答案。
答案 1 :(得分: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)
如果这是您的主要用例,您可以调整它以使用参数。