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 2: L'utilisateur 'toto' peut maintenant utiliser PG. Les deux commandes de départ à savoir sont 'createdb' pour créer une base de donnée et 'destroydb' pour la détruire:
$ createdb nom_base $ createdb nom_base ERROR: createdb: database nom_base already exists. $ createdb: database creation failed on nom_base. $ destroydb nom_base ERROR: destroydb: database nom_base does not exist. $ destroydb: database destroy failed on nom_base. $ createdb nom_base
ETAPE 3: La base créée, il faut maintenant fabriquer et remplir les 'tables' ou tableaux. J'aborde uniquement dans ce document la façon d'effectuer automatiquement la commande sous le 'shell'. Pour savoir comment transcrire ces exemples manuellement, je vous laisse executer un 'psql nom_base' et suivre un '\h'...
$ psql nom_base -c "CREATE TABLE nom_table (nom text, numero int, naissance date) archive = none;" CREATE
La base toto contient à présent le tableau 'nom_table' dont les champs sont 'nom' (du texte), numero (un entier) et naissance (une date):
ETAPE 4: La table 'nom_table' a ses champs définis mais ne possède encore aucune donnée. Il va donc falloir la remplir...
Sous le 'shell', ca peut donner qqchose du genre...
$ psql nom_base -c "INSERT INTO nom_table VALUES ('biellmann',007,'1998/12/31');" INSERT 130368 1
Ca va si on n'a qu'un champ à rentrer...
Comme ce n'est en général pas le cas, je préfère pour ma part mettre toutes les données dans un fichier à part et introduire d'un coup les données:
Contenu du fichier 'insert.txt' à introduire:
\connect - toto COPY nom_table FROM stdin; BIELLMANN 007 1998/12/31 TOTO 009 1996/01/01 \.
NB: Chaque champ est séparé par une tabulation. le '\.' en fin de fichier est indispensable... Pour introduire les données d'un coup dans la base, il suffit alors sous le shell de taper:
$ psql nom_base < insert.txt \connect - toto connecting as new user: toto COPY nom_table FROM stdin; EOF
Vérifions que tout s'est bien passé:
$ psql nom_base -c "SELECT count(*) FROM nom_table;" count ----- 2 (1 row)
La table contient bien deux enregistrements: c'est gagné !!!
Avant de détailler le fonctionnement manuel des principales commandes de 'psql', je vous propose de faire quelques requêtes à la base que nous venons de créer, histoire de s'amuser et d'utiliser les 'wildcards' ou 'caractères jokers' qui permettent des sélections floues...
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)
$ 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.
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:
Vous captez pas encore tout ? Je peux (si j'ai le temps) vous aider un peu mais attention, je suis loin d'être un spécialiste du PERL...
ETAPE 8: ON TEST !!! Entrez "TOTO" dans le champ texte de recherche du formulaire HTML et appuyer sur envoi. Vous obtenez:
qs='recherche=TOTO' key='recherche' et data='TOTO' data modifiee='TOTO' TOTO| 9|01-01-1996 ;
qs='recherche=_I%25LL%25' key='recherche' et data='_I%25LL%25' data modifiee='_I%LL%' BIELLMANN| 7|12-31-1998 ;
Ca marche aussi !!! Mais bizarre, on a des '%25' dans QUERY_STRING, lesquels sont heureusement (accidentellement ?) convertis en '%' dans le script PERL (cf. ligne '$data=~s/%25/%/g;').
D'où viennent donc ces ~#{[`\ de '%25' qui ont failli faire échouer la commande ??? Et bien tout simplement des standards internet. Et oui, pour garantir la lecture/écriture des caractères accentués et spéciaux si communs sur le vieux continent, nos potes d'outre Atlantique ont eu l'idée de remplacer ces caractère par un code standardisé: le "%" du formulaire est ainsi transmis en "%25" dans la QUERY_STRING du client...
En fait, il est simple d'écrire une petite bibliothèque externe en PERL qui reconverti automatiquement les requêtes HTML en langage 'shell' normal. On verra ça dans la rubrique PERL.
Téléchargement PostGreSQL