我想删除一个 Riak 存储桶,以便从我的系统中清除旧数据。我知道没有单一的 Riak API 可以执行此操作,而是删除了 bucket 中的所有密钥,这有效地删除了它。Riak 确实提供了一个 API 来获取所有密钥,所以这相当简单。
我在网上找到了一些代码来做到这一点,但它是用 JavaScript 编写的,并且在 Node.js 下运行。我想要一些 Python 的东西。这可能是一件简单的事情。有没有人有任何例子?
我想删除一个 Riak 存储桶,以便从我的系统中清除旧数据。我知道没有单一的 Riak API 可以执行此操作,而是删除了 bucket 中的所有密钥,这有效地删除了它。Riak 确实提供了一个 API 来获取所有密钥,所以这相当简单。
我在网上找到了一些代码来做到这一点,但它是用 JavaScript 编写的,并且在 Node.js 下运行。我想要一些 Python 的东西。这可能是一件简单的事情。有没有人有任何例子?
就像我在问题中所说的那样,我认为这很简单,尤其是请求库,所以我开发了一个脚本来执行此操作。我从 Riak keys=true
(即非分块)模式开始,但在我较大的存储桶上失败了。我切换到分块模式keys=stream
({...}{...}...{...}
并按顺序处理。还不错。这是代码:
#!/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'
虽然此时我的问题已基本解决,但我怀疑还有更好的解决方案。我欢迎人们在此页面上添加它们。除非几周后没有提供替代方案,否则我不会接受我自己的答案。
如果您可以选择使用 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)
如果这是您的主要用例,您可以调整它以使用参数。