Я хочу удалить Riak Bucket, чтобы удалить старые данные из моей системы. Я понимаю, что для этого не существует единого API Riak, но вместо этого один удаляет все ключи в корзине, что фактически удаляет его. Riak предоставляет API для извлечения всех ключей, так что это довольно просто.

Для этого я нашел код, но он был написан на JavaScript и работает под узлом , Я хочу что-то в Python. Это, вероятно, простая вещь, чтобы сделать. У кого-нибудь есть примеры?

6
Randall Cook 26 Янв 2013 в 03:03

2 ответа

Лучший ответ

Как я уже сказал в вопросе, я подумал, что это было довольно просто, особенно с запросами, поэтому я разработал скрипт для этого. Я начал с 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'

Хотя моя проблема в основном решена на данный момент, я подозреваю, что есть лучшие решения там. Я приветствую людей, чтобы добавить их на этой странице. Я не приму мой собственный ответ, если не предоставлю альтернативы через несколько недель.

11
Randall Cook 25 Янв 2013 в 23:15

Если использование Pyak 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)

Вы можете адаптировать это для использования аргументов, если это ваш основной вариант использования.

2
jfd 13 Авг 2014 в 11:52