6.2. PostgreSQL

PostgreSQL er den mest avancerede frie SQL-database der findes til Linux. PostgreSQL startede som et studieprojekt, og har udviklet sig til fuldt professionel database med alle de avancerede teknologier som kræves idag: views, triggers, stored-procedures, transactions sub-select etc.

Installation af PostgreSQL fra en RPM-fil er den nemmeste måde at installere på. Efter installationen startes PostgreSQL.

[root@hven /root]# rpm -ivh postgresql-7.*.rpm
[root@hven /root]# rpm -ivh postgresql-server*.rpm
[root@hven /root]# /etc/rc.d/init.d/postgresql start 

En nem måde at bruge PostgreSQL fra en webserver er ved at oprette en bruger med navnet nobody. Apache starter webserverne som brugeren nobody og så behøver man ikke angive adgangskoder i sine webprogrammer, idet PostgreSQL ser at man er nobody når man åbner en database.

Før nobody kan få adgang skal nobody oprettes som PostgreSQL bruger. Login som brugeren postgres og opret brugeren nobody. Kender du ikke postgres passwordet, kan det gøres således:

[root@hven /root]# su - postgres
[postgres@hven /pgsql]$ createuser nobody

nobody skal også have en database. Login som nobody. Ved ikke at angive databasenavnet nobody er det default navn når createdb køres. Kender du ikke nobody passwordet, kan det gøres således:

[root@hven /root]# su - nobody
[nobody@hven /]$ createdb

Databasen kan nu anvendes med de ganske få kommandoer SQL har. Der er få forskelle i de forskellige SQL-databaser der findes, men du lærer hurtigt de få forskelle der er, hvis du skifter over til en anden database. Her er brugt SQL-kommandoer som virker med alle de SQL-databaser som du vil komme i nærheden af. Følgende liste af kommandoer opretter en tabel, indsætter en post, retter den samme post, udlæser indholdet af tabellen, sletter en post og sletter tabellen.

-- fil: create.sql
-- PostgreSQL/LinuxBog
-- Kør dette program:
--  psql nobody < create.sql
CREATE TABLE linuxbog(kapitel INT, titel VARCHAR(40));
INSERT INTO linuxbog(kapitel, titel) VALUES(0, 'Indledning');
UPDATE linuxbog SET kapitel=1 WHERE kapitel=0;
SELECT * FROM linuxbog ORDER BY kapitel;
DELETE FROM linuxbog WHERE kapitel=1;
DROP TABLE linuxbog;

SQL-kommandoerne kan nemt indlæses fra en fil med kommandoen

[nobody@hven /]$ psql nobody < create.sql

Hvis du lige undlader at slette posterne (DELETE) og tabellen (DROP), kan eksemplet bruges sammen med de efterfølgende programmer i Shell, PHP, Perl og Python. Bemærk at hver linje er afsluttet med semi-kolon ';'. Semi-kolon bruges kun med programmet psql og ikke i andre fortolkede eller oversatte sprog.

Den interaktive SQL-fortolker, psql, kan anvendes til meget, men skal man have et rigtigt program, bør man bruge et mere generelt programmeringssprog end SQL og så snakke med databasen gennem et bibliotek. Linux har et bredt udvalg af sprog der kan kommunikere med de SQL-databaser der findes til Linux. Næsten alle sprog kan bruges sammen med alle databaserne. Vi har her valgt at bruge PostgreSQL som basis, og vise eksempler på hvordan man anvender disse sammen med:

I /usr/doc/ har du hele PostgreSQL-manualen, typisk her: file:/usr/share/doc/postgresql-7.4.2/html/. Har du en anden version af PostgreSQL, så start her file:/usr/share/doc/ eller file:/usr/doc/. Du kan også bruge kommandoen locate app-postgres.html til at lokalisere stedet, hvor html-manualen er installeret. Desuden ligger manualen også på nettet http://www.postgresql.org/docs/7.4/static/index.html.

PostgreSQL har sin hjemmeside på http://www.postgresql.org/.

PostgreSQL-HOWTO giver et godt overblik http://www.linuxdoc.org/HOWTO/PostgreSQL-HOWTO.html.

6.2.1. Kommandofortolkerprogrammering + PostgreSQL

Kommandofortolkerprogrammer er ikke det mest avancerede, man kan lave, men er alligevel særdeles anvendeligt til at man hurtigt kan få lavet lidt database-tilgang alligevel. For at køre de følgende eksempler, kræves kun at PostgreSQL er installeret. psql har en option så man kan skrive SQL-kommandoer som parameter direkte fra kommandolinjen.

[nobody@hven /]# psql nobody -c "SELECT * FROM linuxbog"

En anden option giver output som HTML. Har du Apache installeret kan der nu laves et simpelt udtræk til web, ved at lægge et lille kommandofortolkerprogram i cgi-bin. Apache kan have dette sub-dir forskellige steder, så den nemmeste måde at finde det er med kommandoen locate cgi-bin. Placér programmet pgsql.sh i cgi-bin og gør det kørbart med kommandoen chmod +x pgsql.sh.

#!/bin/sh
echo Content-type: text/html
echo
echo "<HTML><TITLE>PostgreSQL CGI</TITLE>"
echo "<H1>PostgreSQL CGI</H1>"
psql nobody -H -c "SELECT * FROM linuxbog"
echo "</HTML>"

CGI-programmet kan nu startes fra din browser med URL'en http://localhost/cgi-bin/pgsql.sh. Til test kan programmet også køres fra kommandolinjen: ./pgsql.sh hvorved output kommer ud på skærmen.

Ovenstående SQL-kommando er nok ikke lige det du vil, men nok mere noget i retning af:

psql nobody -H -T "cellspacing='0'" -c "SELECT kapitel AS \"Bog kapitel\", titel FROM linuxbog ORDER BY kapitel DESC LIMIT 10 OFFSET 0"

I ovenstående kommer der en pænere ramme uden om med option -T "cellspacing='0'". Så er hver kolonne angivet, f.eks. kapitel. Typisk har hver kolonne et forkortet navn, hvilket ikke ser godt ud i en tabel. Ved at skrive AS \"Bog kapitel\" får kolonnen et andet navn. ORDER BY kapitel DESC sortere på 'kapitel' og DESC gør det i modsat orden. LIMIT 10 gør at der kun kommer 10 rækker, og OFFSET 0 fortæller at der skal startes med række 0.

Kommandofortolkerprogrammer er gode til små simple test, men man skal nok holde sig fra at lave større programmer. Muligheden er der, og det virker! I de næste afsnit vises det samme eksempel i PHP, Perl og Python, som er bedre til at håndtere de større programmer.

6.2.2. PHP + PostgreSQL

PHP er rigtigt godt sprog til fremstilling af webprogramme. Har du lidt erfaring med programmering i andre sprog, kommer du hurtigt igang med PHP og PostgreSQL.

PHP med PostgreSQL interface installeres nemmest fra RPM-filer. Mandrake 7.0 har modulerne færdigpakket, som kan hentes på http://rpmfind.net/linux/RPM/mandrake/7.0/Mandrake/RPMS/System_Environment_Daemons.html. PHP i en nyere version kan oftest findes hos Troels Arvin http://www.fsr.ku.dk/people/troels/rpms/php/. PostgreSQL har du installeret, så du skal kun hente følgende:

[root@hven /root]# rpm -ivh apache-1.3.9-17mdk.i586.rpm
[root@hven /root]# rpm -ivh mod_php3-3.0.13-6mdk.i586.rpm
[root@hven /root]# rpm -ivh mod_php3-pgsql-3.0.13-6mdk.i586.rpm

Hvis ikke Apache er startet nu, så gør det.

[root@hven /root]# /etc/rc.d/init.d/httpd start

Eksemplet pgsql.php3 bruger den tabel der blev beskrevet i Afsnit 6.1 om SQL.

<html><head><TITLE>LinuxBog PostgreSQL PHP</TITLE></head>
<?  // Her skiftes der fra HTML til PHP-kode med tegnet '<?'
  // Åben en forbindelse til PostgreSQL
  // Ved ikke at angive brugernavn, er det 'nobody' der er brugeren
  $conn = pg_connect("");
  // Udfør en læsning fra tabellen 'linuxbog'
  $res = pg_exec($conn, "SELECT * FROM linuxbog ORDER BY kapitel");
  // For alle poster (linjer), udskriv indholdet
  for ($n = 0; $n < pg_numrows($res); $n++ ) {
    $post = pg_fetch_array($res, $n);
    print( $post["kapitel"]." ".$post["titel"]."<br>\n" );
  }
  // Frigiv hukommelse
  pg_freeresult($res);
  // Luk forbindelsen
  pg_close($conn);
?></html>

Resultatet af ovenstående ser således ud i en browser

1 Indledning

PHP er frit programmel og kan hentes på http://dk.php.net/.

6.2.3. Perl + PostgreSQL

Perl er effektivt programmeringssprog til mange ting. Perl anvendtes i starten ofte til behandling af tekstfiler, men efter de mange år Perl har været fremme, kan man arbejde direkte med databaser. Om det drejer sig om et kommandolinje-program eller et webprogram, så kan Perl klare den opgave.

Ved en normal Linux-installation får du automatisk installeret Perl. Der findes mange moduler til Perl, så du får ikke dem alle installeret. For at bruge PostgreSQL fra Perl, kræves at du installere DBI og DBD-Pg. Det forudsættes at PostgreSQL er installeret. Modulerne kan hentes fra http://sunsite.dk/CPAN/modules/by-category/07_Database_Interfaces. Dernæst finder du de to pakker her:

Installationen er meget nem og står beskrevet i begge pakker, men lad os lige tage den med her for en sikkerheds skyld.
[root@hven /root]# tar xzvf DBI-1.13.tar.gz
[root@hven /root]# cd DBI-1.13
[root@hven DBI-1.13]# perl Makefile.PL
[root@hven DBI-1.13]# make
[root@hven DBI-1.13]# make test
[root@hven DBI-1.13]# make install

Fremgangsmåden er næsten den samme for DBD-Pg-0.93.tar.gz.

[root@hven /root]# tar xzvf DBD-Pg-0.93.tar.gz
[root@hven /root]# cd DBD-Pg-0.93
[root@hven DBD-Pg-0.93]# export POSTGRES_include=/usr/include/pgsql
[root@hven DBD-Pg-0.93]# export POSTGRES_lib=/usr/lib/pgsql
[root@hven DBD-Pg-0.93]# perl Makefile.PL
[root@hven DBD-Pg-0.93]# make
[root@hven DBD-Pg-0.93]# make test
[root@hven DBD-Pg-0.93]# make install

Her er et lille eksempel i Perl der læser fra PostgreSQL. Eksemplet bruger den tabel der blev oprettet i Afsnit 6.2 om PostgreSQL. Tabellen linuxbog åbnes og alle poster udskrives.

#!/usr/bin/perl
# Inkluder DBI-modulet
use DBI;
# Åben en DatabaseHandle til PostgreSQL
$dbh = DBI->connect("DBI:Pg:dbname=nobody");
# Forbered en SQL-kommando for læsning af een tabel
$sth = $dbh->prepare("SELECT * FROM linuxbog ORDER BY kapitel");
# Udfør SQL-kommandoen
$sth->execute;
# For alle poster (linjer), udskriv indholdet
while (($kapitel,$titel) = $sth->fetchrow) {
  print "$kapitel $titel\n";
}
# Nedlæg StatementHandle
$sth->finish;
# Luk forbindelsen til PostgreSQL
$dbh->disconnect;

DBI og DBD har mange flere kommandoer som kan findes i online-manualen

[tyge@hven tyge]$ perldoc DBI
[tyge@hven tyge]$ perldoc DBI::FAQ
[tyge@hven tyge]$ perldoc DBD::Pg

Perl har hjemmesiden http://www.perl.com/ og http://www.perl.org/

6.2.4. Python + PostgreSQL

Python er et af de nyere fortolkede sprog der vinder kraftigt frem. Dette afsnit vil kun berøre Python's forbindelse til PostgreSQL. Du kan læse mere om Python i bogen "Linux - friheden til at programmere".

For at bruge Python sammen med PostgreSQL skal du først have installeret selve Python, og dernæst et PostgreSQL-modul til Python. Python kommer med de fleste distributioner og måske allerede installeret på din maskine. PostgreSQL-modulet findes sammen med PostgreSQL, f.eks. her: ftp://ftp.sunsite.dk/disk1/www.postgresql.org/pub/binary/v7.0/redhat-RPM/RPMS/redhat-6.x/. Installationen er følgende:

[root@hven /root]# rpm -ivh python-1.5.1*.rpm
[root@hven /root]# rpm -ivh postgresql-python-7*.rpm

Her er et lille eksempel i Python der læser fra PostgreSQL. Eksemplet bruger den tabel der blev oprettet i Afsnit 6.2 om PostgreSQL. Tabellen linuxbog åbnes og alle poster udskrives.

#!/usr/bin/python
# Inkluder fra postgresql (pg) modulet
from pg import DB
# Åbne en forbindelse til databasen "nobody"
dbc = DB("nobody")
# Udfør SQL kommando
dbqo = dbc.query("SELECT * FROM linuxbog ORDER BY kapitel")
# For alle poster (linjer), udskriv kapitel og titel
for data in dbqo.dictresult():
    print str(data["kapitel"]) + " : " + data["titel"]
# Luk forbindelsen til databasen
dbc.close()

Gem filen som pgsql.py og gør den kørbar med kommandoen chmod +x pgsql.py. Og prøv så programmet.

[tyge@hven tyge]$ ./pgsql.py

Læs mere om Python hjemmesiden http://www.python.org/.