Seitdem ich von CouchDB gehört habe, fand ich diese Art der Datenhaltung sehr interessant. Wer das Projekt noch nicht kennt: Daten werden als Dokumente über eine REST/HTTP Schnittstelle in Datenbanken abgelegt. Jedes Dokument besteht aus mehreren Feldern, welche beliebig komplexe (JSON-)Daten beinhalten kann. Das Schöne (oder das Biest): Die Daten sind unstrukturiert; d.h. jedes Dokument kann andere Felder haben als jedes andere. Es gibt kein Schema, welches bestimmte Strukturen in einem Dokument verlangt. Wer dazu wissen will, kann sich ja mal die Einführung anschauen.

Eins der Dinge die mir bisher noch fehlen ist die Möglichkeit des Import und Exports von Daten über die Kommandozeile (oder eine WebGui), weswegen ich mit jetzt mit ein wenig Python selbst geholfen habe.

Installation

Zum nutzen der Skripte muss Python 2.6 installiert sein (Bei 2.5 fehlen die Module für JSON):

  1. Datei aus /files herunterladen
  2. Entpacken
  3. mit $ python setup.py install installieren

Nutzung

zeisss@Saturn:test $ couchdb-export.py -h
Usage: couchdb-export.py [options] [databases]
Options:
-h, --help show this help message and exit
-s HOST, --server=HOST, --host=HOST
Which server to use
-p PORT, --port=PORT The port
-d DESTINATION, --destination=DESTINATION
Where to write the files
zeisss@Saturn:test $ couchdb-export.py -s localhost -p 5984 -d .
Backing up localhost:5984 to .
accounts => ./accounts/
config => ./config/
domains => ./domains/
players => ./players/
rooms => ./rooms/
zeisss@Saturn:test $

Alle Parameter sind optional und nutzen die oben angegebenen Werte, falls sie weggelassen wurden. Wenn keine Datenbank angegeben wird, wird der Server nach einer Liste der Datenbanken gefragt und es werden alle exportiert. Das Skript erzeugt einen Unterordner pro Datenbank sowie eine Datei pro Dokument, wobei bestehende Dateien überschrieben werden. Die Ordner werden vorher nicht geleert.

Das Importieren verläuft ähnlich:

zeisss@Saturn:test $ couchdb-import.py -h
Usage: couchdb-import.py [options] [databases]
Options:
-h, --help show this help message and exit
-s HOST, --server=HOST, --host=HOST
Which server to use
-p PORT, --port=PORT The port
-d DIR, --dir=DIR Where to read the files
-f, --force Force the creation of documents, even if a given ID
exists
zeisss@Saturn:test $ couchdb-import.py
Importing . to http://localhost:5984 into [u'accounts', u'config', u'domains', u'players', u'rooms']
Database: accounts
Database: config
Importing config/default_domain.json
- Document with this id already exists. Skipping
Importing config/motd.json
- Document with this id already exists. Skipping
Importing config/version.json
- Document with this id already exists. Skipping
Database: domains
Importing domains/Milkyway.json
- Document with this id already exists. Skipping
Importing domains/sol.json
- Document with this id already exists. Skipping
Database: players
Importing players/miro.json
- Document with this id already exists. Skipping
Database: rooms
Importing rooms/sol_start_room.json
- Document with this id already exists. Skipping
Importing rooms/sol_test_room.json
- Document with this id already exists. Skipping

Importiert werden alle Dateien in den Unterordnern (die Unterordner werden als Datenbanknamen angesehen). Die Dokumentid wird aus dem Inhalt der Datei gelesen (Feld: _id). Wurde keine ID gefunden, wird es der Datenbank überlassen, eine ID zu erzeugen. Sollte es bereits ein Dokument mit der ID in der Datenbank geben, wird die Datei übersprungen (Ausnahme: Der Paramter -f führt zum überschreiben des Dokuments).