We have a new wiki. The migration is not 100% complete. You can help out by moving pages across. This wiki will exist for as long as there are pages left.

The official documentation has moved to http://docs.couchdb.org — The transition is not 100% complete, but http://docs.couchdb.org should be seen as having the latest info. In some cases, the wiki still has some more or older info on certain topics inside CouchDB.

You need to be added to the ContributorsGroup to edit the wiki. But don't worry! Just email any Mailing List or grab us on IRC and let us know your user name.

Getting started with Perl and the CouchDB API.

The following shows the basics of working with the raw CouchDB REST api from Perl. If you want a richer interface that more tightly maps Couch documents into Perl (so you don't have to deal with JSON manually, for example), you should pick your favourite out of the several implementations: Store::CouchDB, CouchDB::Client, AnyEvent::CouchDB, DB::CouchDB::Schema, or for POE lovers POE::Component::Client::CouchDB.

Note that these examples all use the new version of CouchDB, with a JSON interface rather than XML.

Example Wrapper Class

You can save this to a file named CouchDB.pm, then just use it from your program with use CouchDB;. But if you're going to do anything more than mess around, I would recommend getting the Net::CouchDb module from CPAN.

package CouchDB;

use strict;
use warnings;

use LWP::UserAgent;

sub new {
  my ($class, $host, $port, $options) = @_;

  my $ua = LWP::UserAgent->new;

  return bless {
                ua       => $ua,
                host     => $host,
                port     => $port,
                base_uri => "http://$host:$port/",
               }, $class;

sub ua { shift->{ua} }
sub base { shift->{base_uri} }

sub request {
  my ($self, $method, $uri, $content) = @_;

  my $full_uri = $self->base . $uri;
  my $req;

  if (defined $content) {
    #Content-Type: application/json

    $req = HTTP::Request->new( $method, $full_uri, undef, $content );
    $req->header('Content-Type' => 'application/json');
  } else {
    $req = HTTP::Request->new( $method, $full_uri );

  my $response = $self->ua->request($req);

  if ($response->is_success) {
    return $response->content;
  } else {
    die($response->status_line . ":" . $response->content);

sub delete {
  my ($self, $url) = @_;

  $self->request(DELETE => $url);

sub get {
  my ($self, $url) = @_;

  $self->request(GET => $url);

sub put {
  my ($self, $url, $json) = @_;

  $self->request(PUT => $url, $json);

sub post {
  my ($self, $url, $json) = @_;

  $self->request(POST => $url, $json);


Creating a Database

To create a database called foo:

my $db = CouchDB->new('localhost', '5984');

Deleting a Database

To delete a database called foo:

my $db = CouchDB->new('localhost', '5984');

Creating a Document

To create a document in the database foo with the id document_id:

my $db = CouchDB->new('localhost', '5984');
$db->put("foo/document_id", <<JSON);
   "Subject":"I like Perl",
   "Tags":["plankton", "perl", "decisions"],
   "Body":"I decided today that I don't like plankton. I like perl. Or DO I?"

Reading a Document

To read a document from database foo with the id document_id:

my $db = CouchDB->new('localhost', '5984');
my $json = $db->get("foo/document_id");

Getting_started_with_Perl (last edited 2012-08-23 13:09:08 by c-98-193-20-208)