La majorité des
projets de développements informatiques traitent, stockent et restituent
des données et ces données sont pour la plus part
organisées dans des bases de données. Nous avons
précédemment présentés les mécanismes utiles
pour le partage de codes sources et la construction automatique du projet. Le
projet sera construit entièrement si les mises à jour
apportées aux données sont parallèlement
intégrées.
Ainsi pour la migration de nos bases de données, nous
utiliserons un outil intégré à Phing qui facilite la
migration et l'évolution des bases de données d'un projet :
DbDeploy. C'est un outil de gestion des changements d'une base
de données. C'est pour les développeurs ou DBA qui veulent faire
évoluer leur schéma de base de données - ou refactoriser
leur base de données - d'une manière simple,
maîtrisé, flexible et fréquents.
III.1
Problématique
Le problème récurrent avec le
développement de bases de données, c'est qu'à un moment
donné, on devra mettre à jour la base de données existante
et préserver son contenu. Dans les environnements de
développement, il est souvent possible (et même souhaitable) de
balayer la base de données et de la reconstruire à partir de
zéro aussi souvent que le code est reconstruit.
Nous avons constaté que l'un des moyens les plus
faciles pour permettre aux gens de changer la base de données consiste
à utiliser un contrôleur de version scripts SQL delta. Nous avons
également jugé utile de faire en sorte que les scripts
utilisés pour construire des environnements de développement
soient exactement les mêmes utilisés lors de la production.
Maintenir et faire usage de ces deltas peut rapidement devenir une surcharge
importante - dbdeploy vise à combler cette lacune.
III.2 Règles
d'utilisation de dbdeploy
Lors de la création d'un fichier delta il sera important
de suivre les conventions suivantes :
1. Se rassurer que toutes les modifications de base de
données sont écrites comme des scripts delta qui seront
récupérées par dbdeploy.
2. Respecter les conventions de nom pour les scripts delta.
Les noms des scripts doivent commencés par un nombre qui indique l'ordre
dans lequel ils seront exécutés. Il est possible d'ajouter un
commentaire au nom du fichier pour décrire ce que fait le fichier
(exemple : 1Cree_table_client.sql),
3. On peut optionnellement ajouter une section undo à
nos scripts. Tout d'abord, il faut écrire le script qui va
exécuter l'action à faire; Une fois que le script de toutes les
actions à faire est rédigé, inclure dans une nouvelle
ligne le label --//@UNDO. Inclure les tâches d'annulation après
le label.
DbDeploy s'exécute en effectuant des
vérifications pour voir si un script delta particulier a
été exécuté sur une base de données
particulière. Pour ce faire, il utilise le nom du script delta plus le
nom de l'ensemble du delta (qui sera «All», sauf indication
contraire) et le compare avec le contenu de la table de version du
schéma. Si un script delta qui a déjà été
appliqué à une base de données est modifié par la
suite, cette modification ultérieure ne sera pas appliquée
à la base de données.
Tout cela fonctionne très bien tant que vous n'avez pas
besoin de corriger un bugg sérieux dans un script. Il ya deux
façons de réduire ce risque :
· Toujours effectuer
une génération locale avant les vérifications, de cette
façon le problème est constaté et peut être
fixé avant d'être versionner.
· Utilisez
l'intégration continue - si votre serveur de build s'interrompt, le
référentiel de code source ne sera pas étiqueté
jusqu'à ce que le problème soit résolu.
III.3
DbDeployTask
Dans le fichier de configuration de Phing (le build.xml), la
tâche que nous utiliserons est :
DbDeployTask. Lors de son exécution cette tâche
crée un fichier .sql pour effectuer les révisions de base de
données, basée sur les conventions dbdeploy qui sont
centrées autour d'une table changelog de la base de
données. la table changelog doit se présentée
ainsi:
CREATE TABLE changelog (
change_number BIGINT NOT NULL,
delta_set VARCHAR(10) NOT NULL,
start_dt TIMESTAMP NOT NULL,
complete_dt TIMESTAMP NULL,
applied_by VARCHAR(100) NOT NULL,
description VARCHAR(500) NOT NULL
)
· Exemple d'application
<taskdef name="dbdeploy"
classname="phing.tasks.ext.dbdeploy.DbDeployTask"/>
<dbdeploy
url="sqlite:${project.basedir}/data/db.sqlite"
userid="admin"
password="ringo"
dir="${project.basedir}/data/dbdeploy/deltas"/>
L'exemple ci-dessus utilise une base de données SQLite
et les scripts delta se trouvant dans le répertoire dbdeploy/deltas de
la racine du répertoire du projet.
|