Upload
florent-biville
View
670
Download
0
Embed Size (px)
DESCRIPTION
Présentation Liquibase mise à jour pour être plus exhaustive (v2.0.5) avec une démo plus complète. Merci de mentionner "Florent Biville" en tant qu'auteur original si vous souhaitez reprendre cette présentation.
Citation preview
Gestionnaire de migrations
Plan
1. Motivations
2. API
3. Démo
4. Stratégies pour l'existant
Motivations
Modifier BDD en continu
Industrialiser ses migrations
Rapprocher DBA et DÉV
Motivations
Refactoring
Modifier une portion de code, en maintenant la
sémantique de celui-ci.
Motivations
Refactoring
Principe de substitution de Liskov
Couverture de tests
...
Motivations
Refactoring de BDD
Modifier une partie du schéma (structures, données, triggers,
procédures stockées...) tout en maintenant sa sémantique.
Motivations
Refactoring de BDD
Contrats ?
Tests ?
Outillage ?
http://databaserefactoring.com/
Outillage
● Migrate4J BETA
● FlywayDB
● Liquibase
@author: Nathan Voxland
@license: Apache License 2.0
@source: Java (GITHUB)
@currentVersion: 2.0.5 / 3.0.0.RC2
@supports: Oracle, MySQL, PostgreSQL, DB2, ...
Concepts
Historique
Changelog / changesets
Preconditions / contexts
Historique
DATABASECHANGELOG+---------------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------------+--------------+------+-----+---------+-------+| ID | varchar(63) | NO | PRI | NULL | || AUTHOR | varchar(63) | NO | PRI | NULL | || FILENAME | varchar(200) | NO | PRI | NULL | || DATEEXECUTED | datetime | NO | | NULL | || ORDEREXECUTED | int(11) | NO | | NULL | || EXECTYPE | varchar(10) | NO | | NULL | || MD5SUM | varchar(35) | YES | | NULL | || DESCRIPTION | varchar(255) | YES | | NULL | || COMMENTS | varchar(255) | YES | | NULL | || TAG | varchar(255) | YES | | NULL | || LIQUIBASE | varchar(20) | YES | | NULL | |+---------------+--------------+------+-----+---------+-------+
Changelog ~ point(s) d'entrée
<databaseChangeLog xmlns...>
<include file="my/company/migrations/9.1/changelog.xml"
relativeToChangelogFile="true" />
<include file="my/company/migrations/10.0/changelog.xml"
relativeToChangelogFile="true" />
<!-- [...] -->
</databaseChangeLog>
Changeset ~ unité de migration
Identité = Path + ID + Auteur
<changeSet id="exemple_de_changeset" author="florent.biville">
<comment>Vente en ligne de minitels</comment>
<createTable tableName="minitels"
remarks="EVOL-42">
<column name="id" type="INTEGER" />
</createTable>
</changeSet>joué une seule fois sauf si runAlways="true"
changements ensuite interdits sauf si runOnChange="true"
Changeset ~ unité de migration
Pourquoi XML* ?
1. indépendance vendor
2. rollback automatique
3. utilisation SQL possible ;-)
* ou JSON/YAML/"SQL annoté"
Changeset ~ rollback
Rollback manuel (SQL ou tags Liquibase standards)
<changeSet id="exemple_de_changeset" author="florent.biville">
<comment>Vente en ligne de minitels</comment>
<sql>UPDATE Persons SET age = age + 42;</sql>
<rollback>
UPDATE Persons SET age = age - 42;
</rollback>
<!-- <rollback /> pour désactiver le rollback sur un changeset -->
</changeSet>
Preconditions
Requête custom ou tags Liquibase standard
<changeSet id="only_as_system" author="florent.biville">
<comment>Un grand pouvoir implique...</comment>
<preConditions><!-- DRY: <xi:include href="../common/run_as_system.xml" /> -->
<dbms type="oracle" />
<runningAs username="SYSTEM" />
</preConditions>
<!-- danger! high voltage! -->
</changeSet>
Context
Contexte paramétré à l'exécution
<changeSet id="exemple_contexte" context="local,test"
author="florent.biville">
<!-- danger! high voltage! -->
</changeSet>
il suffit qu'un seul des contextes corresponde
DÉMO
https://github.com/fbiville/liquibase-demo
Stratégies pour l'existant : initialisation
Stratégie n°1 Stratégie n°2 Stratégie n°3
Définir 1 état de référence.Définir toutes les migrations à partir de cet état.
Inclure un changeset de dump de la BDD de référence.Définir les migrations ensuite.
Reconstruire toutes les migrations manuellement.Y ajouter ensuite un changeset de dump de données.
Stratégies pour l'existant : initialisation
Stratégie n°1 Stratégie n°2 Stratégie n°3
+ simple- récupération / exécution du dump à la charge de chaque user
+ simple- couplage fort avec le vendor de BDD
+ indépendance vis-à-vis du vendor- fastidieux
Stratégies pour l'existant : intégration
Spring Maven CLI
Utiliser le bean SpringLiquibase.Idéal pour déploiement sur PAAS.
Utiliser le plugin Maven.Idéal pour la CI, aussi riche en options que le client CLI.
Utiliser l'utilitaire en ligne de commandes."Implémentation" de référence.
autres modes disponibles: Ant, listener de Servlet
CONCLUSION
?