POSTGRESql


ETAPE 1: Avant tout, il faut vous logger sous le user 'postgres' et créer un utilisateur de la base:

     $ su -l postgres;createuser 
     Enter name of user to add ---> toto
     Enter user's postgres ID -> 500
     Is user "toto" allowed to create databases (y/n) y
     Is user "toto" allowed to add users? (y/n) y
     createuser: toto was successfully added 
     

N'utilisez de préférence que des utilisateurs shell connus sur votre machine. Pour configurer un nouvel utilisateur, employez le script 'usercfg' de la RedHat en étant logger sous 'root'.

SI VOUS AVEZ DES PROBLÈMES A CETTE ETAPE; C'EST QUE LE POSTMASTER N'EST SÛREMENT PAS (BIEN) LANCÉ... Vérifiez avec la commande:

     $ ps ax | grep post
     886 ?        S      0:00 /usr/bin/postmaster -S -D/var/lib/pgsql -i
     

Notez la présence du -i en fin de ligne: c'est une option du postmaster pour utiliser les sockets TCP/IP que j'ai du rajouté manuellement dans le script /etc/rc.d/init.d/postgresql':

ETAPE 5: Nous avons créer la base 'nom_base' qui contient pour le moment deux enregistrements. Essayons tout d'abord une requête sans 'jokers':

     $ psql nom_base -c "SELECT * FROM nom_table WHERE numero=7;"
     nom      |numero| naissance
     ---------+------+----------
     BIELLMANN|     7|12-31-1998
     (1 row)  
     

Aller, on complique un peu...

$ psql nom_base -c "SELECT nom,naissance FROM nom_table WHERE naissance<'1997/12/31';"

     nom | naissance
     ----+----------
     TOTO|01-01-1996
     (1 row) 
     

ETAPE 6: Et maintenant, on effectue des recherches avec les caractères 'jokers'... Le '%' (pourcent) remplace 0, 1 ou plusieurs caractères, le '_' (underscore) une seule et unique lettre:

$ psql nom_base -c "SELECT * FROM nom_table WHERE nom LIKE '_I%LL%N'";

     nom      |numero| naissance
     ---------+------+----------
     BIELLMANN|     7|12-31-1998
     (1 row)  
     

Intéressant, non ??? En 5 minutes, on vient de créer une mini base de donnée et on peut déjà y faire des requêtes avancées sous le 'shell'...

C'est beau tout ça mais ca sert à quoi ? Et bien vous avez peut-être remarquer qu'il existe un bon nombre d'applications où l'on désire mettre une base de donnée sous le WEB et y faire des interrogations normales ou floues.

Pour relier postgres à Internet, on va utiliser PERL, langage de très haut niveau...

Non, non. Ne partez pas. Pas encore. C'est pas si compliquer. Et les exemples que je vais vous donner vous permettrons de comprendre sans aucune connaissance annexe.


ETAPE 7: Commençons par créer un formulaire html du nom de 'postgres.html', à placer dans le répertoire racine de votre serveur WEB (chercher ces infos dans 'httpd.conf' si vous ne les connaissez pas et taper 'locate httpd.conf' si vous ne savez pas où se trouve le dit fichier...)

Contenu de 'postgres.html'

     <HTML>
      <HEAD>
       <TITLE>Essai Postgres</TITLE>
      </HEAD>

      <BODY BGCOLOR="#FFFFFF">

       <FORM NAME="essai" ACTION="/cgi-bin/postgres.pl">
        <INPUT TYPE=TEXT NAME="recherche" VALUE="" SIZE="15" MAXLENGTH="15">
        <INPUT TYPE=SUBMIT VALUE="Envoi">
       </FORM>
       
      </BODY>
     </HTML>
     

Lorsque vous charger ce document avec un navigateur, choisissons Comunicator 4 par hasard, vous devez voir apparaître une boite de dialogue comme celle qui suit... (cette boite est ici désactivée tout simplement parce que je n'ai pas accès au répertoire cgi-bin de mon prestataire i-france, ce qui est tout à fait normal et même rassurant...)

Le formulaire d'interrogation est prêt, il reste à interfacer Postgres avec le script '/cgi-bin/postgres.pl'. la source de celui-ci est la suivante:

#!/usr/bin/perl

print "Content-type: text/html\n\n";

print <<END1;
<HTML>

 <HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
  <TITLE>Essai interfacage POSTGRES/WEB</TITLE>
 </HEAD>

 <BODY BGCOLOR="#FFFFFF">

END1

    $qs=$ENV{'QUERY_STRING'};  

    foreach $entry (split(/&/,$qs))
     {
      local($key,$data) = split(/=/,$entry,2);
      print "<LI>key=$key et data=$data<BR><BR>\n";  

      $data=~s@/%25/%/g;
      print "$data<BR>\n";
             
      open(IN,"psql nom_base -t -q -c \"SELECT * FROM nom_table WHERE nom LIKE '$data';\" | sort | uniq |");
      while ($ligne=<IN>)
       {
        print "$ligne\n";
       }
      close(IN);
     }
      
print <<END2;

 </BODY>
</HTML>
END2
     

Certes, les puristes de PERL vont râler vu que j'ai pas compresser... Mais bon, c'est pour l'exemple... A noter bien entendu qu'on aurait pu laisser sort | uniq de côté en utilisant la syntaxe SQL 'SELECT DISTINCT * FROM nom_table WHERE nom LIKE ... ORDER BY nom1 DESC;' (merci à Fabrice RAFART).

N'OUBLIEZ PAS de modifier httpd.conf de manière à ce que le 'User nobody' devienne 'User nom_user_postgresql' (sinon, l'accès à la base sera naturellement refusé). Avant la modif, localisez httpd.pid ('locate httpd.pid'); faites un 'cat chemin_obtenu/httpd.pid' (vous devez obtenir un numéro de processus) et faites un 'kill -TERM numero_obtenu' avant de relancer le serveur par 'httpd'.

Le néophyte sera content d'avoir les explications suivantes:


Téléchargement PostGreSQL