Skip to content

Instantly share code, notes, and snippets.

@approximatenumber
Created October 20, 2016 08:50
Show Gist options
  • Save approximatenumber/f99b74c1547cac99de40649e0613c74c to your computer and use it in GitHub Desktop.
Save approximatenumber/f99b74c1547cac99de40649e0613c74c to your computer and use it in GitHub Desktop.
Bash script to migrate from a SQLite database to a MySQL database
#!/bin/bash
## Bash script to migrate from a SQLite database to a MySQL database
## based on vidalon/migrate_sqlite_to_mysql.sh (https://gist.github.com/vidalon/2961155)
## Change VARIABLES to yours to execute the script
SQLITE_SDB_FILE=/tmp/weewx.sdb
SQLITE_FILE=/tmp/swallow.sql
MYSQL_USER=weewx
MYSQL_DATABASE=weewx
MYSQL_PASSWORD=weewx
while getopts ":s:d:u:" opt; do
case $opt in
s)
SQLITE_FILE="$OPTARG" ;;
d)
MYSQL_DATABASE="$OPTARG" ;;
u)
MYSQL_USER="$OPTARG" ;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
# Migrate DB-file to SQL-file
echo "Transforming DB-file to SQL-file..."
sqlite3 $SQLITE_SDB_FILE .dump > $SQLITE_FILE
# Clone the SQLite file to a temporary one
SQLITE_FILE_TMP="${SQLITE_FILE}.tmp"
cp $SQLITE_FILE $SQLITE_FILE_TMP
# First, replace " (double-quotes) with ` (grave accent)
echo "Transforming the SQLite dump into a MySQL compatible one..."
perl -p -i -e 'next unless /CREATE/; s/"/`/g' $SQLITE_FILE_TMP
perl -p -i -e 's/INSERT INTO "([^"]+)"/INSERT INTO `$1`/g' $SQLITE_FILE_TMP
# Remove "BEGIN TRANSACTION;" "COMMIT;", and lines related to "sqlite_sequence" and "PRAGMA foreign_keys=OFF"
perl -i -n -e 'print unless /BEGIN TRANSACTION;/' $SQLITE_FILE_TMP
perl -i -n -e 'print unless /COMMIT;/' $SQLITE_FILE_TMP
perl -i -n -e 'print unless /sqlite_sequence/' $SQLITE_FILE_TMP
perl -i -n -e 'print unless /PRAGMA foreign_keys=OFF/' $SQLITE_FILE_TMP
# Replace "autoincrement" with "auto_increment"
perl -p -i -e 's/autoincrement/auto_increment/gi' $SQLITE_FILE_TMP
# Replace booleand fields default values
perl -p -i -e "s/'t'/'1'/gi" $SQLITE_FILE_TMP
perl -p -i -e "s/'f'/'0'/gi" $SQLITE_FILE_TMP
# Restore to the target MySQL databse
if [[ ! -z "`mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$MYSQL_DATABASE'" 2>&1`" ]];
then
echo "Database "$MYSQL_DATABASE" already exists! Deleting it and recreating..."
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD --execute="DROP DATABASE $MYSQL_DATABASE;"
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD --execute="CREATE DATABASE $MYSQL_DATABASE;"
else
echo "Database "$MYSQL_DATABASE" doesn\`t exist! Creating it..."
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD --execute="CREATE DATABASE $MYSQL_DATABASE;"
fi
echo "Restoring $MYSQL_DATABASE with modified dump..."
mysql -u$MYSQL_USER $MYSQL_DATABASE -p$MYSQL_PASSWORD < $SQLITE_FILE_TMP
# Cleaning up...
rm $SQLITE_FILE_TMP
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment