2009-07-18 22 views
29

Tras el inicio rápido en liquibase He creado un conjunto de cambios (muy tonto :))Cómo trabajar con Liquibase, un ejemplo concreto

Código:

<?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> 

He creado un esquema limpio y He lanzado el comando migrate.

Liquibase creó la base de datos, con las tablas de soporte databasechangelog y ..lock.

¿Ahora cómo puedo rastrear los cambios ?? He modificado el conjunto de cambios añadiendo un nuevo elemento createTable pero cuando intento la "actualización" de comandos Liquibase me dice que esto

Migration Failed: Validation Failed: 
    1 change sets check sum 

por lo que no creo que han entendido la manera de trabajar con Liquibase.

¿Alguien puede señalarme la dirección correcta?

Gracias

+0

Con frecuencia, cuando está desarrollando una nueva aplicación o agregando nuevas características, debe modificar su esquema de base de datos para requisitos o errores. Para una aplicación nueva, he recurrido a un script ejecutado manualmente para eliminar todas las tablas y eliminar todo de la tabla DATABASECHANGELOG (y la tabla LOCK para una buena medida). Puede desenrollar un solo cambio eliminando su registro de la tabla de registro de cambios y desenrollando su cambio con una anti-consulta: eliminar tablas agregadas, modificar tablas/columnas, etc. Si hubiera usado runOnChange desde el principio, esto hubiera cortado mi archivo migrations.xml en un 50% y ahorró mucho tiempo. –

+0

jeejava.com/spring-boot-liquibase-gradle-example/ – user3470953

Respuesta

37

Nunca se debe modificar un <changeSet> que ya fue ejecutado. Liquibase calcula sumas de comprobación para todos los changeSets ejecutados y los almacena en el registro. Luego volverá a calcular esa suma de comprobación, la comparará con las almacenadas y fallará la próxima vez que la ejecute si las sumas de comprobación difieren.

Lo que necesita hacer en su lugar es agregar otra<changeSet> y poner su nuevo elemento createTable en ella.

QuickStart es bueno para leer, pero de hecho es rápido :-) Echa un vistazo a la completa manual, particularmente su sección ChangeSet.

+1

eso está claro ahora, no encontré y leí esa página en el manual :) – apelliciari

+3

Hay ocasiones en que necesita modificar los elementos publicados de ChangeSet. Consulte la respuesta runOnChange que dio Javid para obtener más información. Solíamos hacer lo de "nunca cambiar", pero descubrimos que era una política muy difícil quedarse cuando hay veces que necesita actualizar el conjunto de cambios (y eso le sucederá a medida que se involucre más con liquida). Mantener opciones abiertas –

+0

Gracias! esta es la respuesta correcta –

26

Esta respuesta actualmente aceptada está ligeramente desactualizada en función de los cambios en Liquibase 2.x. En la versión 2.x, Liquibase aún fallará si la suma de comprobación md5 ha cambiado para un conjunto de cambios, pero puede especificar el atributo runOnChange si desea poder modificarlo.

Desde el documentation:

runOnChange - ejecuta el cambio de la primera vez que se ve y cada vez que el conjunto de cambios se ha cambiado

+2

Esta respuesta debe considerarse junto con la respuesta aceptada. runOnChange le permitirá modificar un conjunto de cambios existente. La respuesta aceptada es correcta al decir que no debe cambiar los conjuntos de cambios existentes, pero hay ocasiones en que podría necesitarlo, y su política debería permitirlo. –

+0

"veces que pueda necesitar", como en un entorno de desarrollo y realizando cambios iterativos durante el desarrollo. Sería raro si su primer despliegue en un entorno de prueba tuviera un puñado de conjuntos de cambios relacionados, superpuestos y contradictorios. –

3

Si se trata de un cambio a un conjunto de cambios que básicamente ya se ha hecho, puede modificar manualmente la base de datos para que su md5 para ese conjunto de cambios coincida con la nueva. Bueno para pequeños cambios textuales. O puede eliminar esa fila de conjunto de cambios de su tabla.

+0

Hago esto mucho, pero creo que es mejor eliminar el registro y desenrollar el cambio manualmente que meterme con el md5sum. Solo una vez, cuando un DB de aplicación había sido modificado por un script manual en producción, recurrí a la edición md5sum. –

Cuestiones relacionadas