Raspberry Pi

Raspberry Pi: SQLite statt MySQL

Raspberry Pi: SQLite statt MySQL

Viele Webseiten oder anderen Projekten können durch eine Datenbank gestützt werden. Dabei fällt der erste Gedanke meistens auf ein Datenbanksystem mit MySQL.

MySQL bringt viele Features mit, ist weit verbreitet und daher auch mit einer Vielzahl von Programmiersprachen ansprechbar. In Hinblick auf den Raspberry Pi ergibt sich jedoch ein Nachteil: Die MySQL Software (MySQL Daemon) läuft permanent und beantsprucht Prozessor und Arbeitsspeicher des Einplatinencomputers. Die Ressourcen des Pi gehen daher primär für MySQL drauf, sodass man beim Betrieb von weiteren Arbeitsspeicher lastigen Anwendungen Abstriche machen muss.

Wer den Pi nur als reinen Webserver mit einer MySQL Datenbank nutzt und die Zugriffszahlen verhältnismäßig überschaubar bleiben, so sollte dies kein Problem für die Wunderplatine sein.

SQLite und dessen Vorteile

Eine weitaus ressourcenschonenderes Datenbanksystem ist SQLite. SQLite ist eine Programmbibliothek, welche eine relationale Datenbank umfasst und mit den gängigen SQL-Befehlen (Querys) arbeitet. Im Gegensatz zu MySQL ist keine permanent laufende Software notwendig die den Pi beansprucht. Die Datenbank besteht jediglich aus einer einzelnen Datei die gerade mal wenige 100 Kilobyte groß ist.

SQLite installieren

Um eine SQLite Datenbank aus dem Terminal heraus oder mit Bash-Skripten ansprechen zu können muss folgendes Paket installiert werden.

sudo apt-get install sqlite3

Da die meisten jedoch eine Datenbank im Zusammenhang mit einer Webanwendung (PHP) benutzen, muss eine PHP-Erweiterung für SQLite installiert werden. Einen eingerichteten Webserver, wie zum Beispiel der Apache, mit PHP muss natürlich vorhanden sein.

sudo apt-get install php5-sqlite

Das wars auch schon: Damit ist die eigentliche Installation von SQLite abgeschlossen.

phpLiteAdmin installieren

Damit wir unsere SQLite Datenbanken auch bequem verwalten können ohne einen Skript zu schreiben, benötigen wir ein entsprechendes Tool. Wer schon mit MySQL gearbeitet hat, dem dürfte das webbasierte Datenbankmanagement System phpMyAdmin ein Begriff sein. Für SQLite gibt es ebenfalls eine Anwendung die nur aus einer PHP-Datei besteht: phpLiteAdmin. Zum installieren laden wir uns das Tool herunter: phpLiteAdmin

Anschließend wird das Archiv entpackt und die Datei phpliteadmin.php in euer Webverzeichnis kopiert, entweder manuell oder via FTP. Ich habe mich für das Standardverzeichnis /var/www/ entschieden. Im Rahmen des Artikels verwende ich die Standardeinstellungen von phpLiteAdmin:

  • Passwort: admin
  • alle Datenbanken im Verzeichnis der phpliteadmin.php werden automatisch eingelesen

In einem Browser deiner Wahl kannst du anschließend phpLiteAdmin aufrufen. Dazu gibst du die IP Adresse des Pi´s in deinen Browser und navigierst zur eben hochgeladenen Datei phpliteadmin.php.

Screenshot phpLiteAdmin

Screenshot phpLiteAdmin

Ein Nachteil von SQLite ist, dass nur ein Passwort, also nur ein Benutzer angelegt werden kann. Die vielfälltigen Einstellungsmöglichkeiten von phpLiteAdmin werde ich in einem späteren Artikel näher erläutern. Wer nicht so lange warten kann, kommentiert seine Frage unter dem Artikel :)

Eine Alternative zu phpLiteAdmin ist der SQLite Browser.

SQLite und PHP

Jetzt wo wir SQLite und ein passendes Verwaltungstool installiert haben, können wir damit arbeiten. Im nachfolgenden Abschnitt möchte ich ein paar PHP-Codeausschnitte zeigen, mit denen ich in meinen Projekten des öfteren arbeite. Dabei decke ich die bekannten MySQL Befehle CREATE TABLE, INSERT INTO, und SELECT ab. Wenn es um SQLite geht, arbeite ich mit PHP Data Objects (PDO). Dabei handelt es sich um eine Schnittstelle um aus PHP heraus Datenbanken anzusprechen. Grundlegende PHP Kenntnisse setze ich an dieser stelle voraus.

Datenbank erstellen:

Eine Datenbank erstellen wir entweder ganz bequem über phpLiteAdmin oder mit folgendem Code.

$dbh = new PDO("sqlite:testdb.sqlite");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Mit diesen beiden Zeilen öffnen wir die Datenbankdatei testdb.sqlite und setzen den Errormodus fest. Da diese Datenbankdatei noch nicht existiert wird diese erstellt. Die Datenbankdatei heißt also testdb.sqlite und der Name der Datenbank somit testdb.

Tabelle erstellen:

In unserer Datenbank wollen wir natürlich auch eine oder mehrere Tabellen haben / erstellen. Dies kann wieder über das webbasierte Verwaltungstool phpLiteAdmin geschehen oder mit einem Code nach folgendem Beispiel.

$dbh = new PDO("sqlite:testdb.sqlite");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec("CREATE TABLE einplatinencomputer (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
preis INTEGER)");

Nachdem ich meine Datenbank testdb geöffnet habe, erstelle ich die Tabelle einplatinencomputer. Diese soll 3 Spalten haben:

  • Spalte 1: ID: Primärschlüssel, Datentyp Integer, auto increment
  • Spalte 2: name: Datentyp Text
  • Spalte 3: preis: Datentyp Text

Beim erstellen einer Tabelle mit Hilfe eines eigenen Quellcodes kann danach mit phpLiteAdmin überprüft werden ob die Tabelle richtig generiert wurde.

In eine Tabelle schreiben:

Anschließend fügen wir in die Tabelle einplatinencomputer einen Datensatz ein. Folgende Daten sollen dabei übermittelt werden.

  • ID: wird automatisch und fortlaufend eingefügt da die Spalte die Option “autoincrement” hat
  • name: Raspberry Pi
  • preis: 30 Euro

$insert = $dbh->prepare("INSERT INTO einplatinencomputer (name, preis) VALUES (:name, :preis)");

// Parameter binden
$name = "Raspberry Pi";
$preis = "30 Euro";
$insert->bindParam(':name', $name);
$insert->bindParam(':preis', $preis);
$insert->execute();

if($insert) {
echo "Datensatz hinzugefuegt: ";
}
else {
echo "Datensatz NICHT hinzugefuegt!";
}

War das Schreiben des Datensatzes erfolgreich, sollte die Ausgabe Datensatz hinzugefuegt: erscheinen.

Datensätze auslesen:

Unseren eingetragenen Datensatz wollen wir uns im Anschluss auch mal ausgeben lassen. Mit einem SELECT Query können wir einen bestimmten Datensatz oder alle Datensätze einer Tabelle auslesen.

$result = $dbh->query("SELECT * FROM einplatinencomputer");
foreach ($result as $row) {
$id = $row["id"];
$name = $row["name"];
$preis = $row["preis"];
echo $id . ": " . $name . "(Preis: " . $preis . ")";
}

Abschließend fügen wir alle vorgestellten Codeausschnitte zusammen in einer PHP Datei:

$dbh = new PDO("sqlite:testdb.sqlite");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec("CREATE TABLE einplatinencomputer (
id INTEGER PRIMARY KEY AUTOINCREMENT,

name TEXT,
preis INTEGER)");

// Parameter binden
$name = "Raspberry Pi";
$preis = "30 Euro";
$insert->bindParam(':name', $name);
$insert->bindParam(':preis', $preis);
$insert->execute();

if($insert) {
echo "Datensatz hinzugefuegt: ";
}
else {
echo "Datensatz NICHT hinzugefuegt!";
}

$result = $dbh->query("SELECT * FROM einplatinencomputer");
foreach ($result as $row) {
$id = $row["id"];
$name = $row["name"];
$preis = $row["preis"];
echo $id . ": " . $name . "(Preis: " . $preis . ")";
}

Der zusammengefasste Skript arbeitet letztendlich folgende Schritte ab:

  • 1. Datenbankdatei testdb.sqlite öffnen bzw. wenn diese nicht vorhanden ist wird die Datei testdb.sqlite erstellt
  • 2. Tabelle einplatinencomputer mit 3 Spalten anlegen
  • 3. Datensatz schreiben
  • 4. Datensatz auslesen

Wenn alles funktioniert, sollte folgende Ausgabe ersichtlich werden.

Screenshot: Webbrowser SQLite Test

Screenshot: Webbrowser SQLite Test

Insgesamt kann man sagen das SQLite eine leistungsstarke Alternative zu MySQL ist. Das Datenbanksystem ist leicht zu implementieren und für den Raspberry Pi sehr ressourcenschonend. Anhand der vorgestellten Codeausschnitte konnte ich hoffentlich dem ein oder anderen schon etwas helfen. Bei großer Nachfrage werde ich die Codebeispiele ausweiten. Bei Fragen hinterlasst gerne einen Kommentar.

Quellen (Stand: 20.9.14): forum-raspberrypi.de, wikipedia.org, php.net

Hinterlasse eine Antwort

Kommentare

  • Hübsches Tutorial,
    kleiner Fehler am Rande: du wirfst den Datentyp von Preis durcheinander –
    “Spalte 3: preis: Datentyp Text” – wird aber als Ganzzahl erstellt.
    Entweder komplett als Text oder (noch besser) nur die Zahl speichern und . ” Euro” hinterm Preis ausgeben.

    • Hallo Thomas,

      das mit dem Datentyp ist mir bewusst. Ich wollte der Einfachheit halber das auch als Text haben damit man den Preis als Wortlaut, also z.B. “ca. 30 Euro” oder “knapp 30 Euro”, in der Datenbank speichert. Je nach Vorhaben ergeben sich ja dann die konkreten Datentyp. Danke für den Feedback! :)

      • Hallo Tony,
        erstmal danke für das bereitstellen dieses Beitrages.
        Allerdings kann ich PHP5, PhP5-Sqlite nicht installieren.
        Ich bekomme jedes mal den Fehler:
        E: Für Paket »php5-sqlite« existiert kein Installationskandidat.
        Ich habe im Internet recherchiert allerdings nichts gefunden
        würde mich über Hilfe freuen

  • Hallo Tony,

    für die tolle Ausarbeitung deines Tutorials kann ich nur danken. Ich probiere schon länger mit mehreren verschiedenen Einplatinencomputern herum und messe hauptsächlich Umweltdaten (Wetter und so..) und gebe sie auf verschiedenen Displays aus. Das ist aber auf die Dauer zu langweilig. Deshalb will ich die ganzen Daten auch mal speichern und vielleicht auch in einer eigenenen Website grafisch darstellen. Da hat mir dein Tutorial jetzt die richtige Inspiration gegeben. Vielen Dank dafür :-)

    • Hallo Friedrich,

      Danke für das positive Feedback! Wenn es soweit ist, kannst du ja mal zeigen was daraus entstanden ist: Entweer hier in den Kommentaren oder per E-Mail :)

      Gruß

      Tony

  • Moin Tony,
    ich probiere gerade phpliteadmin mit sqlcipher zu verbinden, denn ich möchte einen Login erstellen und hierzu soll die Datenbank verschlüsselt sein, als auch das Passwort verschlüsselt sein.
    Ich stelle mich jedoch etwas doof an. Hoffe du kannst mir weiterhelfen! Ich nutze einen raspberry pi 2 und habe probiert die folgenden links zu kombinieren:
    Die bearbeitete phpliteadmin-Verion habe ich von hier:
    https://groups.google.com/forum/#!topic/phpliteadmin/m48xOozopPo
    Installiert habe ich SQLcipher mit hilfe von:
    https://coolaj86.com/articles/building-sqlcipher-for-node-js-on-raspberry-pi-2/

    Nun jedoch bekomme ich folgende Fehler:
    PDO_sqlite: installed
    PDO_sqlcipher: not installed
    SQLite3: installed
    SQLite3+cipher: not installed
    SQLiteDatabase: not installed

    wenn ich eine Datenbank über diese gedownlodete phplite-admin-Website erstellen will……
    Hilfe?!….