Массовое восстановление документов CouchDB с помощью CouchDB-Python

1

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

CouchDB version = 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)

Это не сработало и ничего не восстановлено в моей базе данных. Теперь, когда я пытаюсь просмотреть все версии этих документов, я не могу ничего вернуть, кроме 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 -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 доступ ко всем старым версиям (который я прочитал, является своего рода неправильным обозначением)?

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

Теги:
couchdb-2.0
couchdb-python

1 ответ

0
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню