Comment migrer une base SQLite vers MySQL? La réponse dans ce guide... ;)

Il vous arrive peut-être de devoir migrer une base SQLite vers MySQL, mais vous ne savez pas comment: je donne la solution. xD

Prérequis:

Démarrage

Cet article concerne la troisième et dernière partie d'un guide complet pour configurer un environnement Docker avec un projet Symfony fonctionnant sous PHP-FPM, Nginx, MySQL et phpMyAdmin:

  1. Configuration du projet avec un serveur Nginx et PHP-FPM. Accéder à l'article.
  2. Configuration du projet docker avec Mysql et phpMyAdmin. Accéder à l'article.
  3. Migration de la base de donnée SQLite vers Mysql.

IMPORTANT: Vous pouvez utiliser ce guide sans Docker, mais vous devrez adapter les directives.

Migration de SQLite vers MySQL

Dump de la base SQLite

Le but est de créer un fichier SQL qui sera injecté à la base MySQL via PhpMyAdmin.

Avec la console, placez-vous dans le dossier du projet, puis exécutez la commande suivante:

cd data
sqlite3 database.sql .dump > dump.sql

Créez un nouveau fichier sqlite-to-mysql.py et ajoutez les lignes suivantes:

#! /usr/bin/env python

import sys
import re

def main():
    print "SET sql_mode='NO_BACKSLASH_ESCAPES';"
    constraints = []
    lines = sys.stdin.read().splitlines()
    for line in lines:
        processLine(line, constraints)
    for constraint in constraints:
        print constraint

def processLine(line, constraints):
    if (
        line.startswith("PRAGMA") or 
        line.startswith("BEGIN TRANSACTION;") or
        line.startswith("COMMIT;") or
        line.startswith("DELETE FROM sqlite_sequence;") or
        line.startswith("INSERT INTO \"sqlite_sequence\"")
       ):
        return
    line = line.replace("AUTOINCREMENT", "AUTO_INCREMENT")
    line = line.replace("NOT DEFERRABLE INITIALLY IMMEDIATE", "")
    line = line.replace("CLOB", "TEXT")
    line = line.replace("DEFAULT 't'", "DEFAULT '1'")
    line = line.replace("DEFAULT 'f'", "DEFAULT '0'")
    line = line.replace(",'t'", ",'1'")
    line = line.replace(",'f'", ",'0'")
    result = extractConstraint(line, constraints)
    while result != -1:
        line = result
        result = extractConstraint(line, constraints)
    in_string = False
    newLine = ''
    for c in line:
        if not in_string:
            if c == "'":
                in_string = True
            elif c == '"':
                newLine = newLine + '`'
                continue
        elif c == "'":
            in_string = False
        newLine = newLine + c
    print newLine

def extractConstraint(line, constraints):
    p = re.compile('CREATE TABLE (\w+) (.*), CONSTRAINT (\w+) FOREIGN KEY \((\w+)\) REFERENCES (\w+) \((\w+)\)( ON DELETE CASCADE)? (.*)')
    matches = p.findall(line)
    line = -1
    for match in matches:
        line = 'CREATE TABLE ' + match[0] + ' ' + match[1] + ' ' + match[len(match)-1]
        constraint = 'ALTER TABLE ' + match[0] + ' ADD CONSTRAINT ' + match[2] + ' FOREIGN KEY (' + match[3] + ') REFERENCES ' + match[4] + '(' + match[5] + ')'
        if len(match) == 8:
            constraint += match[6]
        constraints.append(constraint + ';')
    return line

if __name__ == "__main__":
    main()

J'ai récupéré ce script sur ce site, et ai apporté mes propres améliorations. ;)

Exécutez la commande suivante:

cat dump.sql | python sqlite-to-mysql.py > dump-mysql.sql

Le fichier dump-mysql.sql au format MySQL a été généré.

Importation dans MySQL

Pour réaliser cette opération, votre configuration Docker doit être éxcutée (docker-compose up -d).

Avec PhpMyAdmin (http://localhost:8080/, connectez-vous à la base symfony-demo tout en la sélectionnant.

Cliquez sur l'onglet Importer et choisissez le fichier dump-mysql.sql.

Cliquez sur Exécuter pour obtenir le résultat suivant.

Symfon Demo MySQL

Si votre but était uniquement la migration de SQLite vers MySQL, vous pouvez vous arrêter ici. ;)

Utilisation de la base de donnée MySQL par le projet Symfony.

On a maintenant une configuration Docker qui permet d'accéder au site Symfony Demo, d'avoir une base de donnée MySQL gérable par PhpMyAdmin mais le projet utilise toujours la base de donnée SQLite. Il faut la configuration du projet.

Avec la console, à la racine du projet, exécutez la commande suivante:

subl .env

Remplacez la ligne DATABASE_URL=sqlite:///%kernel.project_dir%/data/database.sqlite par:

DATABASE_URL=mysql://symfony-demo:symfony-demo@mysql:3306/symfony-demo

Des réseaux networks ont été précédement créés avec Docker dont un nommé mysql. Ce réseau est utilisé avec le port dans lequel MySQL répond.

Renommez la base de donnée SQLite:

mv data/database.sqlite data/database_old.sqlite

Ceci permet de garantir que la base SQLIte ne sera pas utilisée. :)

Testez maintenant votre projet et vous obtenez alors ceci:

Symfony Demo MySQL

Pour conclure

Grâce à ce guide, vous avez pu configurer un environnement Docker avec PHP-FPM, MySQL et PhpMyAdmin et migrer une base SQLite vers MySQL.

Le Github du projet complet est ici: https://github.com/clemdesign/docker-symfony-demo.

Je remercie Eko qui m'a facilité le travail pour configurer le conteneur php-fpm et nginx. :)

En espèrant que ce guide vous a été utile. ;)

Je vous dis à plus pour le prochain article. xD


Liens utiles:

Article précédent Article suivant


Ajouter un commentaire