如何在Python中删除Riak存储桶?
我想删除一个Riak的存储桶,以便清理我系统中的旧数据。我知道Riak没有一个单独的API可以直接做到这一点,而是有一个可以删除存储桶里所有键的API,这样就相当于删除了整个存储桶。Riak确实提供了一个API来获取所有的键,所以这其实挺简单的。
我在网上找到了一些代码来实现这个功能,但它是用JavaScript写的,并且在Node环境下运行。我想要的是Python版本的。这应该是个简单的事情。有没有人能分享一些例子?
2 个回答
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)
你可以根据需要调整代码,使用参数来满足你的主要需求。
11
正如我在问题中提到的,我觉得这个问题挺简单的,特别是用上了requests这个库,所以我写了一个脚本来处理这个事情。我一开始使用的是Riak的keys=true
模式(也就是非分块模式),但在处理较大的数据桶时失败了。于是我改用了分块模式(keys=stream
),但输出的结果不再是一个单一的JSON对象,而是一系列连接在一起的对象(也就是{...}{...}...{...}
)。一个同事给我提供了一个正则表达式,帮助我从聚合的Riak响应中分离出这些JSON对象,我就按顺序解析和处理它们。还不错。以下是代码:
#!/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'
虽然我的问题在这个时候大部分解决了,但我觉得可能还有更好的解决方案。我欢迎大家在这个页面上分享其他的方案。如果几周后没有人提供替代方案,我才会考虑接受我自己的答案。