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":
Mit folgendem mysql2sqlite.bash:
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
$ 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
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
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
dakira am :
Dirk Deimeke am :
Chain am :
if [ "x$1" == "x" ]; then
echo "Usage: $0 "
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/ CHARACTER SET [^ ]* / /g' |
sed 's/ COLLATE [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ set([^)]*) / 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 | tee $1.lite | 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
Chain am :
#!/bin/bash
if [ "x$1" == "x" ]; then
echo "Usage: $0 "
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/ CHARACTER SET [^ ] / /g' |
sed 's/ COLLATE [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ set([^)]*) / 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 | tee $1.lite | 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
Dirk Deimeke am :
Chain am :
Dirk Deimeke am :
Chain am :
Leider hat es immer noch nicht gepasst. Meine Applikation ist relativ bald gecrasht, und die Probleme die sich ergeben sind leider zu mannigfaltig (fehlende Indexes etc.) -- aber! Ich schreibe hier, was mich wirklich auf die richtige Spur gebracht hat!
Nämlich SQL Fairy. http://sqlfairy.sourceforge.net/
Scheint alt und unbetreut, aber zu unrecht, denn es ist wirklich nett, und brauchbar. Hier der Aufruf der bei mir Anhieb geklappt hat:
// Dump File umwandeln (mysqldump wie oben gezeigt)
sqlt -f MySQL -t SQLite dump.sql > dump-sqlite.sql
// Einlesen!
cat dump-sqlite.sql | sqlite datenbank.db
---
Ich konnte sogar meine Daten behalten, indem ich danach dann einfach die alte DB "drübergeprügelt" habe. Da die Tables ja schon bestehen, werden bloß die Daten eingefügt. Und schon war alles perfekt:
mv datenbank.db datenbank-old.db
sqlite datenbank-old.db .dump | sqlite datenbank.db
Wichtig zu erwähnen: SQLFairy kümmert sich lediglich um die Struktur. Die Daten muss man also noch irgendwie einfügen. Da empfehle ich nach wie vor dein Script
Auf dass es jemandem helfen möge =)
Dirk Deimeke am :
Ich vermute, dass viele Applikationen damit Probleme haben werden, dass SQLite nur vier Datentypen kennt.
SQL-Fairy muss ich mir einmal anschauen.