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

6 投票
2 回答
3493 浏览
提问于 2025-04-17 13:42

我想删除一个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'

虽然我的问题在这个时候大部分解决了,但我觉得可能还有更好的解决方案。我欢迎大家在这个页面上分享其他的方案。如果几周后没有人提供替代方案,我才会考虑接受我自己的答案。

撰写回答