hampft!

Noch 'ne Datenbank: SQLite

SQLite macht ihrem Namen alle Ehre. Kleiner und leichter geht's kaum. SQLite kommt als Library und Datenbank-Frontend daher. Ein Server ist nicht nötig, Zugriffe über das Netzwerk sind nicht vorgesehen. Alle Daten einer Datenbank werden in einem einzelnen File gehalten. Der Zugriff wird über die normalen Schreib- und Leserechte auf dieses File geregelt.

Installation auf einem Debian-System geht natürlich per apt, das Problem ist nur, die richtigen Versionen zu erwischen, SQLite hat ab Version 2.6.x ein anderes Fileformat, mit Woody wird aber 2.4.x geliefert. Passende Debian-Files findet man am leichtesten unter http://apt-get.org.

Datenbank ohne Abfrage bringt nix, dazu braucht man auch irgendwelche Bindings. SQLite kommt mit einer beeindruckenden Liste daher; Perl, PHP und Python sind dabei. Integration in C++ oder C Programme ist genauso einfach.

Zur Installation hab ich folgende Debian Quellen und Pakete verwendet (/etc/apt/sources.list)

# PHP
deb http://debian.moolfreet.com ./

# sqlite
deb http://ftp.acc.umu.se/mirror/mirrors.evilgeniuses.org.uk/debian/backports/woody gnome2.2/

Nach dem obligatorischen apt-get update habe ich dann installiert:

apt-get update
apt-get install php4 php4-pear php4-sqlite sqlite sqlite-doc

Sinnvollerweise sollte man die neuen Einträge aus der sources.list wieder entfernen und wieder apt-get update aufrufen, um sich nicht bei einem späteren Upgrade plötzlich wild aus diesen Quellen Pakete zu installieren.

Mit dem Kommandozeilentool sqlite kann man nun ein Datenbankfile einrichten:

Man erzeuge das File create.sql:

create table test(
    t_id   integer primary key,
    t_data varchar(200)
);
insert into test values (1, 'bla');
insert into test values (2, 'blubber);

das dann mit sqlite test.db ".read create.sql" in das Datenbankfile test.db einliest.

Vorausgesetzt, das File ist für den Apache-User (www-data:www-data) lesbar, kann man jetzt z.B. per PHP Pear die Datenbank so auslesen:

<html>
<body>
<?php
    require_once "DB.php";
    $db=DB::connect('sqlite:///'.getcwd().'/test.db', array('debug'=>2));
    $db->setFetchMode(DB_FETCHMODE_ASSOC);

    print "<pre>\n";
    $res=$db->query("SELECT * FROM test");
    while ($row=$res->fetchRow()) {
        print_r($row);
    }
    print "</pre>\n";
?>
</body>
</html>

SQLite ist rasend schnell und kann erstaunlich viel: Die bei mysql fehlenden Subselects beherrscht SQLite genauso sicher wie Transaktionen. Nur die Familie der "ALTER dingenskirchens" Befehle sind nicht implementiert, das ist aber leicht zu Verschmerzen, denn eine Folge von ".dump tabelle", "drop tabelle", Dumpfile editieren und ".read dumpfile" tut das selbe.

Links:


hampft! ->