Après quelques minutes heures de batailles, enfin un script qui fonctionne pour convertir votre schéma + vos data Mysql vers Sqlite. Merci à nfuria sur SOF
Je pensais la conversion simple via une option directe dans mysqldump… Pas du tout, c’est le parcours du combattant pour passer du format Mysql à Sqlite. Ce script est le meilleur : il fonctionne d’un coup (j’en ai testé 5 autres avec différents niveau de succès). L’astuce du script est que plutôt que vouloir retravailler le dump mysql à la main en virant les caractères non acceptés par sqlite ou en supprimant certaines instructions SQL, il se base sur le module (fiable) SQL::Translator de Perl.
Nécessite donc d’avoir le paquet “sqlfairy” installé.
#!/bin/sh #=============================================================================== # USAGE: ./mysql2sqlite.sh
# DESCRIPTION: Converts MySQL databases to SQLite # Triggers are not converted # REQUIREMENTS: mysqldump, Perl and module SQL::Translator, SQLite #=============================================================================== if [ "$#" = 2 ]; then USER="$2" else echo "Usage: $0 " exit fi if [ -s $1.db ]; then read -p "File <$1.db> exists. Overwrite? [y|n] " ANS if [ "$ANS" = "y" ] || [ "$ANS" = "Y" ] ; then rm $1.db else echo "*** Aborting..." exit fi fi # extracts the necessary structure for SQLite: mysqldump --skip-triggers --skip-add-locks --routines --no-data --compatible=ansi \ --compact -u $USER --password $1 > /tmp/$1_$$_str.sql # verify if [ ! -s /tmp/$1_$$_str.sql ]; then echo "*** There are some problem with the dump. Exiting." exit fi # translates MySQL syntax structure to SQLite using the script "sqlt" of the # perl module SQL::Translator (that corrects the foreign keys, indexes, etc.) sqlt -f MySQL -t SQLite --show-warnings /tmp/$1_$$_str.sql \ 1> /tmp/$1_$$.sqlite 2> /tmp/$1_$$_sqlt.log # verify if [ ! -s /tmp/$1_$$.sqlite ]; then echo "*** There are some problem with the sql translation. Exiting." exit fi # adds statements to allow to load tables with foreign keys: echo "PRAGMA foreign_keys=OFF;" >> /tmp/$1_$$.sqlite echo "BEGIN TRANSACTION;" >> /tmp/$1_$$.sqlite # extracts the data (simple inserts) without locks/disable keys, # to be read in versions of SQLite that do not support multiples inserts: mysqldump --skip-triggers --no-create-db --no-create-info --skip-add-locks \ --skip-extended-insert --compact -u $USER \ --password $1 >> /tmp/$1_$$.sqlite # adds statements to finish the transaction: echo "COMMIT;" >> /tmp/$1_$$.sqlite echo "PRAGMA foreign_keys=ON;" >> /tmp/$1_$$.sqlite # correct single quotes in inserts perl -pi -e ' if (/^INSERT INTO/) { s/\\'\''/'\'\''/g; } ' /tmp/$1_$$.sqlite # load the sql file and generate the SQLite db with the same name # of the MySQL database sqlite3 $1.db < /tmp/$1_$$.sqlite 2> /tmp/$1_$$sqlite.errlog # verify ERRORS=`cat /tmp/$1_$$sqlite.errlog | wc -l` if [ $ERRORS = 0 ]; then echo "* Conversion complete. Verify the file < $1.db >" rm /tmp/$1_$$* else echo "*** There are some problem. Verify the files < /tmp/$1_$$* >" fi
Pingback: Nono’s Vrac 70 « m0le'o'blog