Maintenant que vous savez ce que c’est NoSQL et REST (si ce n’est pas le cas, vois ces articles dans la catégorie « Tutoriels » à droite), voici donc l’exemple « couchDB » qui adhére à ces 2 concepts.
Primo, selon la définition par Wikipedia à ce jour, coucheDB est : un système de gestion de base de données libre et orientée documents, écrit en langage Erlang.
Secondo, lisez l’article rédigé par mon collègue « Lou Ferrand » ( qui a déjà été cité dans l’article « NoSQL » pour que vous vous remémorez ce qu’est couchDB), cela évitera que je répète des explications déjà bien fournies ^^
Je vais quand même être gentille (pour les paresseux) et donner ma définition propre : CouchDB est un projet Apache de gestion de bases de données non relationnelles, sans utilisation de SQL mais se reposant sur l’architecture REST afin d’exploiter les capacités de HTTP et de … JSON via … ERLANG.
Vous allez me dire :
-impossible de gérer des données sans SQL!! Et bien figurez-vous que si!!
-Si pas de SQL, comment faire les joitures complexes?? (du genre, toutes les factures non payées des clients qui ont déposé leur bilan) … je n’ai pas encore trouvé l’argument pour appuyer ma phrase : « Pas besoin de jointures complexes puisqu’il n’y a plus de SQL ». Mais la réponse est cette phrase. Je vous en dirais plus lorsque je serais experte ^^ (tôt ou tard^^)
– Comment va-t-on manipuler les données si on n’utilise plus de SQL ? voir ci-dessous
Dans la suite, je vais juste vous présenter les basiques en PHP, reste à vous d’élargir votre périmètre 🙂
Je suis partie d’un tutoriel rédigé en anglais.
Il est nécessaire d’installer couchDBX
/*
* Nous allons définir les paramètres du serveur
*/
$serveur['host'] = "localhost";
$serveur['port'] = 5984;
/*
* Une instance de couch que l’on va utiliser pour les tests
* (on établit la connexion)
*/
$couch = new CouchSimple($serveur);
/*
* Commençons par tester la connexion
*/
$resp = $couch->send(« GET », « / »);
/*
* Qui répondra normalement [response: string(46) « {« couchdb »: « Welcome », « version »: « 0.10.1 »} »]
*/
var_dump($resp); // response: string(46) « {« couchdb »: « Welcome », « version »: « 0.7.0a553″} »
/*
* Récupération de la liste des bases de données
*/
$resp = $couch->send(« GET », « /_all_dbs »);
print « Get a list of all databases in CouchDb « ;
var_dump($resp); // string(17) « [« test_suite_db »] »
/*
* Création d’une nouvelle base de données
*/
$resp = $couch->send(« PUT », « /test »);
var_dump($resp); // string(12) « {« ok »:true} »
/*
* Récupération de tous les documents enregistrés dans cette base de données
*/
$resp = $couch->send(« GET », « /test/_all_docs »);
var_dump($resp); // string(27) « {« total_rows »:0, »rows »:[]} »
/*
* Il est nécessaire de comprendre le principe de REST
* Si on utilise PUT, il faudra mettre
* $resp = $couch->send(« PUT », « /test/123 », ‘{« _id »: »123″, »data »: »my data2″}’);
* Si on utilise POST, il faudra mettre
* $resp = $couch->send(« POST », « /test », ‘{« _id »: »123″, »data »: »my data »}’);
*/
print « Create a new document in the database test with the id 123 and some data »;
$resp = $couch->send(« POST », « /test », ‘{« _id »: »123″, »data »: »my data »}’);
var_dump($resp); // string(42) « {« ok »:true, »id »: »123″, »rev »: »2039697587″} »
/*
* Afin de gérer les modifications concurrente, couchDB ne donne pas droit à une modification
* que si on lui renseigne la dernière révision du document à modifier.
* Comment? en récupérant cette révision (_rev)
*
*/
$resp = $couch->send(« GET », « /test/123?_revs=true »);
var_dump($resp);
/*
* Méthode bourrin pour récupérer la révision
*
*/
$tab = split(« : »,$resp);
$tab = split(« \ » »,$tab[2]);
print « revision = « .$tab[1];
/*
* Modifier un document en renseignant la dernière révision
*/
print « Trying to modify a document in the database test with the id 123 and some data »;
$resp = $couch->send(« PUT », « /test/123 », ‘{« _rev »: »‘.$tab[1].' », »data »: »modified data »}’);
var_dump($resp); // string(42) « {« ok »:true, »id »: »123″, »rev »: »2039697587″} »
/*
* Récupération à nouveau de tous les documents dans la base de données qu’on a créé
* On voit que le document précédemment modifié a bel et bien changé de contenu
*/
print « Get all documents in test again, seing doc 123 there »;
$resp = $couch->send(« GET », « /test/_all_docs »);
var_dump($resp); // string(91) « {« total_rows »:1, »offset »:0, »rows »:[{« id »: »123″, »key »: »123″, »value »:{« rev »: »2039697587″}}]} »
/*
* On voit que le document précédemment modifié a bel et bien changé de contenu
*/
print « Get back document with the id 123 »;
$resp = $couch->send(« GET », « /test/123 »);
var_dump($resp); // string(47) « {« _id »: »123″, »_rev »: »2039697587″, »data »: »my data »} »
/*
* Suppression de la base de données qu’on a créé
*/
print « Delete our \ »test\ » database »;
$resp = $couch->send(« DELETE », « /test/ »);
var_dump($resp); // string(12) « {« ok »:true} »
/*
* La classe couchSimple
*/
class CouchSimple {
function CouchSimple($serveur) {
foreach($serveur AS $key => $value) {
$this->$key = $value;
}
}
function send($method, $url, $post_data = NULL) {
/*
* Initialisation d’une connexion par socket
*/
$s = fsockopen($this->host, $this->port, $errno, $errstr);
if(!$s) {
echo « $errno: $errstr\n »;
return false;
}
$request = « $method $url HTTP/1.0\r\nHost: localhost\r\n »;
if($post_data) {
$request .= « Content-Length: « .strlen($post_data). »\r\n\r\n »;
$request .= « $post_data\r\n »;
}
else {
$request .= « \r\n »;
}
fwrite($s, $request);
$response = « »;
while(!feof($s)) {
$response .= fgets($s);
}
list($this->headers, $this->body) = explode(« \r\n\r\n », $response);
return $this->body;
}
}