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.
Prérequis:
- Python 2.7
- SQLite 3
- MySQL
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:
- Configuration du projet avec un serveur Nginx et PHP-FPM. Accéder à l'article.
- Configuration du projet docker avec Mysql et phpMyAdmin. Accéder à l'article.
- 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.
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:
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.
Liens utiles:
Article précédent Article suivant
Ajouter un commentaire