This repository was archived by the owner on Aug 20, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcouchdb_dump.py
More file actions
executable file
·64 lines (56 loc) · 2.27 KB
/
couchdb_dump.py
File metadata and controls
executable file
·64 lines (56 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env python
import sys
import json
import argparse
import requests
def parse_args():
parser = argparse.ArgumentParser(description='Dump couchdb documents as JSON')
parser.add_argument('-H', '--host', dest='host', default='localhost', help='database host')
parser.add_argument('-P', dest='port', type=int, default=5984, help='database port')
parser.add_argument('-u', dest='username', help='database username')
parser.add_argument('-p', dest='password', help='database password')
parser.add_argument('-b', dest='bulk_size', type=int, default=1000)
parser.add_argument('database', help='the database to dump')
return parser.parse_args()
def dump(host, port, database, username, password, page_size=5000):
auth = (username, password or '') if username else None
uri = 'http://{}:{:d}/{}/_all_docs'.format(host, port, database)
session = requests.Session()
response = session.get(uri, auth=auth, params={
'include_docs': True,
'limit': page_size + 1,
})
sys.stdout.write('{"docs":[\n')
previous_doc = None
while True:
if response.status_code == 200:
response_json = response.json()
next_doc = None
rows = response_json['rows']
for index, row in list(enumerate(rows)):
doc = row['doc']
if index == page_size:
next_doc = doc
break
else:
next_doc = None
if previous_doc:
sys.stdout.write(',\n')
del doc['_rev']
sys.stdout.write(json.dumps(doc, separators=(',', ':'), ensure_ascii=False))
previous_doc = doc
if next_doc:
response = session.get(uri, auth=auth, params={
'include_docs': True,
'startkey_docid': next_doc['_id'],
'limit': page_size + 1,
})
else:
break
else:
sys.stderr.write("Response status: {:d}".format(response.status_code))
sys.exit(1)
break
sys.stdout.write(']}\n')
ARGS = parse_args()
dump(ARGS.host, ARGS.port, ARGS.database, ARGS.username, ARGS.password, page_size=ARGS.bulk_size)