viernes, 30 de agosto de 2013

CouchDB desde perl, primeros pasos


CouchDB es una base de datos NOSQL de apache. Según leemo en Wikipedia "Se trata de una base de datos NoSQL que emplea JSON para almacenar los datos, JavaScript como lenguaje de consulta por medio de MapReduce y HTTP como API.1 Una de sus características más peculiares es la facilidad con la que permite hacer replicaciones.". ¡FANTÁSTICO!

Bueno, veamos como hacer desde perl para conectar a esta base y hacer algunas operaciones (simple ABM)...


# Para empezar usamos estos modulitos perl que baje de cpan
# Mas info dobre Store::CopuchDB en http://search.cpan.org/~norbu/Store-CouchDB-2.8/lib/Store/CouchDB.pm
use strict;
use Store::CouchDB;
use JSON;
# database
my $couch_db = Store::CouchDB->new();
# si tenemos la base con usuario y pass hacemos
# my $couch_db = Store::CouchDB->new( { user => '<mi user>', pass => 'mi pass', host => 'localhost o lo que sea' } );
 
 
 
 #creo una base de datos llamada 'pancho'
$couch_db->create_db('pancho');
print "base creada\n";

print "enter para seguir...";
<STDIN>;
#le configuro que use la base pancho
$couch_db->config({db => 'pancho'});
print "base seteada\n";

#Agrego un documento a mi base couchDB
my $doc = decode_json (' 
{
    "type":"persona",
    "nombre":"Felipe",
    "apodo":"Pipe",
    "telefonos":[
        {"tipo":"casa","numero":"123456789"}
        ]
}');
$couch_db->put_doc({doc => $doc});

print "Pipe agregado\nenter para seguir...";
<STDIN>;

$doc = decode_json (' 
{
    "type":"persona",
    "nombre":"Alberto",
    "apodo":"Beto",
    "telefonos":[
        ]
}');

my $inserted_doc = $couch_db->put_doc({doc => $doc});
print "Id del documento insertado (_id): $inserted_doc\n";
print "Beto agregado\nenter para seguir...";
<STDIN>;

$doc = decode_json (' 
{
    "type":"persona",
    "nombre":"Francisco",
    "apodo":"Pancho",
    "telefonos":[
        {"tipo":"casa","numero":"123456789"},
        {"tipo":"trabajo","numero":"987654321"},
        {"tipo":"celular","numero":"963258741" }
        ]
}');
$couch_db->put_doc({doc => $doc});

print "Pancho agregado\nenter para seguir...";
<STDIN>;
#leo un documento por su id
my $mi_doc = $couch_db->get_doc({id => $inserted_doc});
print "\n\nJSON:" . encode_json($mi_doc) . "\n\n";
print "Apodo de documento traido: " . $mi_doc->{apodo} . "*******\n";

$mi_doc->{apodo} = 'kuki';

#cambio el apodo
print "Apodo nuevo: " . $mi_doc->{apodo}  . "\n";
#actualizo el documento
$couch_db->put_doc({doc => $mi_doc});


#borro el documento
$couch_db->del_doc({id => $inserted_doc});

#borro la base

print "Registro modificado\nenter para seguir...";
<STDIN>;


print "\n";
1;






La instalación de CouchDB en windows es trivial, corre el instalador que se baja de http://couchdb.apache.org/ y listo.
yo para laburar perl desde windows uso DWIM Perl,l una genial distribución que tiene un perl basado en strawberry perl, muchos módulos de cpan preinstalados y el IDE Padre para programar en perl, que está muy copado.
Con estas herramientas instaladas para hacer el ejemplo de arriba solo debemos hacer
cpan -i JSON
cpan -i Store::CouchDB



Agregado 4/2014:
Luego de usar durante algún tiempo esta versión de Store::CouchDB de CPAN descubro que tengo un problema con los valores false y true, el problema viene de que perl no tiene false y true propiamente dichos (0 es false, etc) por lo que si quiero poner un valor false en CouchDB lo guarda como el string "false" (lo mismo con true).
Este problema se soluciona usando
Types::Serialiser::false
o
Types::Serialiser::true

También estoy usando una versión más reciente de Store::CouchDB, al momento la 3.6 que extrañamente no se encuentra en CPAN pero sí en github, podemos bajarla desde https://github.com/norbu09/Store-CouchDB.