web-dev-qa-db-fra.com

Comment travailler avec Liquibase, un exemple concret

Après le démarrage rapide liquibase j'ai créé un changeset (très stupide :))

Code:

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.6"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.6
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.6.xsd">

    <changeSet id="1" author="me">
        <createTable tableName="first_table">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <createTable tableName="new_table">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
        </createTable>
    </changeSet>

</databaseChangeLog>

J'ai créé un schéma propre et j'ai lancé la commande migrate.

Liquibase a créé la base de données, avec les tables de support databasechangelog et ..lock.

Maintenant, comment puis-je suivre les changements ?? j'ai modifié le changeset en ajoutant un nouvel élément createTable mais quand j'essaye la commande "update" liquibase me le dit

Migration Failed: Validation Failed:
     1 change sets check sum

donc je ne pense pas avoir compris la façon de travailler avec liquibase.

Quelqu'un peut me diriger dans la bonne direction ??

Merci

32
apelliciari

Vous ne devez jamais modifier un <changeSet> qui a déjà été exécuté. Liquibase calcule les sommes de contrôle pour tous les changeSets exécutés et les stocke dans le journal. Il recalculera ensuite cette somme de contrôle, la comparera à celles stockées et échouera la prochaine fois que vous l'exécuterez si les sommes de contrôle diffèrent.

Ce que vous devez faire à la place est d'ajouter un autre <changeSet> et y mettre votre nouvel élément createTable.

QuickStart est une bonne lecture mais il est en effet rapide :-) Consultez la section complète manuel , en particulier sa section ChangeSet .

39
ChssPly76

Cette réponse actuellement acceptée est légèrement obsolète en raison des modifications apportées à Liquibase 2.x. Dans la version 2.x, Liquibase échouera toujours si la somme de contrôle md5 a changé pour un changeset, mais vous pouvez spécifier l'attribut runOnChange si vous voulez pouvoir le modifier.

De la documentation :

runOnChange - Exécute le changement la première fois qu'il est vu et chaque fois que le jeu de changements a été changé

27
Javid Jamae

S'il s'agit d'une modification d'un ensemble de modifications qui a déjà été effectuée, vous pouvez modifier manuellement la base de données afin que son md5 pour cet ensemble de modifications corresponde à la nouvelle. Bon pour les modifications textuelles mineures. Ou vous pouvez supprimer cette ligne d'ensemble de modifications de votre table.

3
rogerdpack