Массовое восстановление документов CouchDB с помощью CouchDB-Python - PullRequest
0 голосов
/ 17 октября 2018

Я случайно удалил все документы в базе данных CouchDB и хочу восстановить их.

CouchDB версия = 2.2.0 Python = 2.7, и я использую библиотеку python-couchDB.

Мой CouchDB не выполняет никакого сжатия, и 1260 документов перечисляются в doc_del_count при вызове/ couchip: 5984 / my_db

Я следовал инструкциям здесь: Получить только что удаленный документ

и настроить его в Python следующим образом:

docs_to_put_back = []
ids_to_put_back = []
for id in db.changes()['results']:
     ids_to_put_back.append(id)
for id in ids_to_put_back:
    rev = db.get(id, revs=True, open_revs='all')
    current_revision = rev[0]['ok']['_rev']
    current_number = rev[0]['ok']['_revisions']['start']
    rev_id = rev[0]['ok']['_revisons']['ids'][1] # The last revision id
    old_doc = db.get(id, rev=str(current_number-1)+'-'+rev_id) 

Я начал печатать old_doc отсюда, и большую часть времени он возвращал NoneType, но я видел, что некоторые распечатывали документы, которые я хотел восстановить, поэтому я добавил это в код:

    if old_doc != None:
        db.save(old_doc, rev=current_revision)

Thisне работает и ничего не восстановлено в моей базе данных.Теперь, когда я пытаюсь просмотреть все ревизии этих документов, я не могу вернуть ничего, кроме NoneType, когда вызываю old_doc.Я попытался перебрать все ревизии следующим образом:

for id in ids_to_put_back:
rev = db.get(_id, revs=True, open_revs='all')
current_revision = rev[0]['ok']['_rev']
current_number = rev[0]['ok']['_revisions']['start']
rev_list = rev[0]['ok']['_revisions']['ids']
counter = 1
for revision in rev_list[1:]:
    old_doc = db.get(_id, rev=str(current_number-counter)+'-'+revision)
    if old_doc == None:
        counter += 1
        continue
    elif old_doc != None:
        docs_to_put_back.append(old_doc)
        break
    else:
        pass  

docs_to_put_back возвращает пустой список.Из моего понимания, если моя база данных не сжимается, я смогу получить старые документы, если у меня есть их старые номера редакций.Однако из того, что я читал, кажется, что это может быть не так.

Я также попытался сначала поместить документ в базу данных, а затем попытался получить старый номер ревизии с помощью curl, например:

curl -X PUT http://localhost:5984/db/id
{"ok": true, "id":"id", "rev":""3-b7ff1b0135c051822dd2958aec1a1b9c"}
curl -X GET http://localhost:5984/db/id?rev=2-1301c6dd3257decf978655f553ae8fa4
{"_id":"id", "rev":"2-1301c6dd3257decf978655f553ae8fa4", "_deleted":true}
curl -X GET http://localhost:5984/db/id?rev=1-42283a6b30639b12adddb814ba9ee4dc
 {"error":"not_found", "reason":"missing"}

Я заскочил?Разве у CouchDB нет доступа ко всем старым ревизиям (которые я прочитал - это своего рода неправильное название)?

Это был не лучший мой день, так что, если вы можете мне помочь, это было бы здорово!Спасибо!

1 Ответ

0 голосов
/ 19 октября 2018

Оказывается, я не могу вернуть эти удаленные документы, если вы слишком долго ждете.По умолчанию CouchDB будет проверять ваши базы данных каждый час и запускать сжатие, если оно превышает 131 кб.После этого все мои старые ревизии «отсутствуют».

Если бы только у CouchDB была кнопка Отменить для ошибки пользователя ....

...