Skip to content

Von MySQL nach SQLite ...

Wie hier schon mehrfach im Blog geschrieben, bin ich ein grosser Fan der Mini-Datenbank SQLite.

Jetzt habe ich ein (verbesserungswürdiges aber funktionierendes) Skript gefunden, dass einen MySQL-Dump für SQLite aufbereitet: How-to: Convert mysql to sqlite

Dump der MySQL-Datenbank ziehen, wichtig ist die Option "--compatible=ansi":

$ mysqldump -u root -p --compatible=ansi --skip-opt generator > dumpfile
$ mysql2sqlite.bash dumpfile
$ sqlite3 dumpfile.db

Mit folgendem mysql2sqlite.bash:

#!/bin/bash
if [ "x$1" == "x" ]; then
  echo "Usage: $0 <dumpname>"
  exit
fi

cat $1 |
grep -v ' KEY "' |
grep -v ' UNIQUE KEY "' |
grep -v ' PRIMARY KEY ' |
sed '/^SET/d' |
sed 's/ unsigned / /g' |
sed 's/ auto_increment/ primary key autoincrement/g' |
sed 's/ smallint([0-9]*) / integer /g' |
sed 's/ tinyint([0-9]*) / integer /g' |
sed 's/ int([0-9]*) / integer /g' |
sed 's/ character set [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ on update [^,]*//g' |
sed 's/\\r\\n/\\n/g' |
sed 's/\\"/"/g' |
perl -e 'local $/;$_=<>;s/,\n\)/\n\)/gs;print "begin;\n";print;print "commit;\n"' |
perl -pe '
if (/^(INSERT.+?)\(/) {
  $a=$1;
  s/\\'
\''/'\'\''/g;
  s/\\n/\n/g;
  s/\),\(/\);\n$a\(/g;
}
'
> $1.sql
cat $1.sql | sqlite3 $1.db > $1.err
ERRORS=`cat $1.err | wc -l`
if [ $ERRORS == 0 ]; then
  echo "Conversion completed without error. Output file: $1.db"
  rm $1.sql
  rm $1.err
else
  echo "There were errors during conversion.  Please review $1.err and $1.sql for details."
fi

Verheiraten von SQLite und SQuirreL SQL ...

Über mein Lieblingsdatenbankabfragewerkzeug SQuireL SQL habe ich in anderem Zusammenhang schon einmal etwas geschrieben.

Den JDBC-Treiber von SQLiteJDBC herunterladen und ins lib-Verzeichnis der Squirrel-Installation kopieren.

Einen neuen Treiber nach folgendem Muster anlegen.



Name: SQLite
Example URL: jdbc:sqlite:
Website URL: http://www.zentus.com/sqlitejdbc/
Class Name: org.sqlite.JDBC

Danach kann eine neue Datenbank nach diesem Muster angelegt werden (unter Windows Backslashes durch Slashes ersetzen), ein Login wird nicht gebraucht.:

SQLite, noch einmal ...

Wie bereits angekündigt, wollte ich mal etwas zu SQLite schreiben.

Da ich das Werkzeug mal wieder im Büro gebraucht habe und fast zeitgleich eine Anfrage im ubuntuusers.de-Forum aufkam, hier also ein bisschen Text dazu:

SQLite ist eine Datenbank in einer Datei, das heisst, es muss kein Server-Dienst laufen. Das Client-Programm ist auch gleichzeitig das Datenbankverwaltungstool.

SQLite ist in allen aktuellen Mobiltelefonen (als Telefonbuch / Adressverwaltung) zu finden und wird aktiv von (beispielsweise) Adobe, Bloomberg, Mozilla und Symbian gefördert.

SQLite gibt es als Sourcecode und vorcompiliert für Linux, Mac OS X, und Windows, sowie auch als JDBC-Treiber oder Perl-Modul.

Natürlich kann SQLite nicht alles was ein Client-Server-Datenbanksystem kann, aber für 95% der Anwendungsfälle einer Privatperson reicht es aus.

Ein sehr grosser Anteil von SQL-Kommandos wird unterstützt.

Es gibt nur vier Speicherklassen Integer, Real, Text, Blob. "create table"-Statement anderer Datenbanksysteme wird in der Regel problemlos interpretiert (nur, dass im Hintergrund beispielsweise statt VARCHAR TEXT benutzt wird).

Die Aufgabe:
Zwei Dateien: Eine enthält Adressdaten in Folgender Form (telneu.txt, 1.8 GB, ~60 Millionen Zeilen): Vorname Nachname;Strasse;Ort;PLZ;Telnr; (Je Zeile ein Datensatz), die Zweite Datei enthält nur Postleitzahlen (plz.txt, ~1000 Zeilen).

Aus der ersten Datei werden alle Datensätze gesucht, deren Postleitzahlen in der zweiten Datei vorkommen.
sqlite> CREATE TABLE telneu (Vorname_Nachname text, Strasse text, Ort text, PLZ text, Telnr text);
sqlite> .separator ";"
sqlite> .import telneu.txt telneu
sqlite> CREATE INDEX idx_telneu_plz ON telneu (PLZ);
sqlite> CREATE TABLE plz (plz text);
sqlite> .import plz.txt plz
sqlite> SELECT * FROM telneu WHERE plz IN (SELECT plz FROM plz);


Vielleicht hilft es Euch auch.

Hier ein paar Links:
- Downloads - Paket "sqlite3" in Ubuntu
- Dokumentation
- Datentypen
- SQL-Syntax
- JDBC-Treiber
- Perl-Modul - Paket "libdbd-sqlite" in Ubuntu
- Firefox Extension SQLite Manager

SQLite

Ein kleines "Erinner mich". Ich muss dringend einmal einen Artikel zu SQLite schreiben. Damit kann man wirklich schnell gute Dinge tun.

Diese "Datenbank in einer Datei" ist wirklich unglaublich. Die Beschäftigung damit lohnt sich in jedem Fall. Die Datenbank findet sich in jedem Handy und es gibt Portierungen für nahezu alle Betriebssysteme.