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