On vous a fourni un dump MySQL avec le nom de toutes les tables en minuscule, alors que le joli projet qui doit l'utiliser réclame le nom des tables avec des majuscules de ci, de là.
L'idée de modifier le tout manuellement étant une très mauvaise idée, on va donc automatiser un peu le processus.
Problématique
Nous avons donc un dump sql (nommé dump_base.sql) contenant des noms de tables tout en minuscule :
Et notre programme nous demande des noms de tables avec ces noms :
Résolution
Principe
Nous allons construire une commande sed qui va se charger d'effectuer les modifications à nos noms de tables dans notre fichier de dump MySQL.
Pour cela, on va :
- Extraire le nom des tables du fichier de dump pour se constituer un dictionnaire ;
- Modifier notre dictionnaire pour mettre les majuscules aux bons endroits ;
- Utiliser ce dictionnaire pour la modification de notre dump.
Extraction du nom des tables
On construit notre dictionnaire grâce à la commande suivante :
awk -F\` '/^CREATE TABLE/{print $2,$2}' dump_base.sql > dictionnaire.txt
Cette commande va nous créer un fichier texte dans lequel le nom des tables sera doublé :
Modification du dictionnaire
Avec notre joli éditeur de texte préféré, on modifie le fichier du dictionnaire pour avoir sur chaque ligne le nom de la table provenant du fichier dump ainsi que le nom de la table que l'on souhaite avoir.
Les deux noms séparés par un espace :
Construction de notre commande de modification
On va utiliser la commande awk qui va se charger de parcourir notre fichier dictionnaire et nous créer une commande de remplacement sed qui va se charger d'effectuer toutes les modifications nécessaires dans notre dump Mysql.
awk -F " " 'BEGIN {print "sed -i \""} { print "s/" $1 "/" $2 "/g;" } END {print "\" dump_base.sql"}' dictionnaire.txt
Dans notre exemple, le résultat de cette commande sera :
Il ne reste plus qu'a lancer cette commande pour que les tables de notre fichier de dump soient valides.
Précaution
Il faut faire attention à l'ordre des tables dans le fichier dictionnaire.
Étant donnée que la commande sed générée va appliquer les modifications l'une après l'autre de manière globale dans le fichier de dump, si un nom de table est contenu dans une autre, l'ordre est important.
Dans notre exemple, nous avons deux tables de ce type admGlobalModifications
et admGlobal
Si notre fichier dictionnaire est comme ceci :
Le résultat final sera incorrect pour la table admGlobalModifications
car la modification pour la table admGlobal
aura été effectuée précédemment.