Sei sulla pagina 1di 30

Gestión de Cambios

de BDD con LiquiBase

ISC – Abril 2012


Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com

1
Agenda

Contexto
La problemática del cambio
¿Qué es LiquiBase?
Características principales de LiquiBase
¿Cómo es la gestión con LiquiBase?
Primeros Pasos
Rolling Back de Cambios
Buenas Prácticas
Acciones de Refactoring disponibles
Integración con Maven

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 2
Contexto

¿Si nunca desarrollamos código sin un control de versiones,


por que desarrollamos la BDD sin el?

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 3
La problemática del cambio (1/3)

Las BDD son una parte fundamental en la mayoría de los proyectos.

¿Como realizamos el seguimiento de sus cambios?

Necesitamos:
Soportar múltiples desarrolladores.

Soportar ramas y versiones.

Flexibilizar y automatizar como


se aplican los cambios.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 4
La problemática del cambio (2/3)

Antes de LiquiBase
Ejecución manual de cambios en el modelo de BDD.
No podíamos garantizar que una BDD se encontrase en
una versión concreta.
Nos era demasiado costoso revertir la BDD a estados
anteriores.
No podíamos garantizar la sincronía entre el modelo de
datos y el modelo de entidades de la aplicación.
Generación manual de documentación sobre el modelo de
datos.
Las incorporaciones de un nuevo miembro al equipo eran
mas costosas.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 5
La problemática del cambio (3/3)

Soluciones?

6
¿Qué es LiquiBase? (1/3)

LiquiBase es una librería OpenSource (bajo licencia Apache


2.0), independiente de la base de datos, que nos permitirá
realizar el seguimiento, la gestión y aplicación de cambios en
nuestro modelo de datos.

Database Refactoring
Database Change Management

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 7
¿Qué es LiquiBase? (2/3)

Permite aplicar cambios de una forma controlada y


automatizada así como llevar un histórico de los
mismos.
Pensada especialmente para equipos de desarrollo
ágiles, con múltiples desarrolladores y ramas de código.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 8
¿Qué es LiquiBase? (3/3)

Una de las ideas es conseguir que los refactoring o nuevos


desarrollos de código subidos a SVN/CVS, se acompañen del
refactoring del modelo de BDD, es decir subir también los
changesets LiquiBase.

De esta forma cuando el resto de desarrolladores actualicen,


descargaran código y las modificaciones de BDD necesarias para
que este funcione.

Se puede conseguir que aplicar estos cambios sea casi


transparente para los desarrolladores, ya que LiquiBase puede
utilizarse no solo desde una linea de comandos, si no también
mediante tareas Ant o mediante Maven.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 9
Entorno Desarrollo

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 10
Características principales de LiquiBase

LiquiBase soporta:
Extensiones
Fusionar (merge) cambios de múltiples desarrolladores
Ramificaciones de código
Múltiples Bases de Datos
Gestionar datos en producción como también en varias etapas de
testeo y desarrollo
Cluster-safe database upgrades
Actualizaciones automáticas o generación de scripts SQL que pueden
ser aprobadas y aplicadas por un DBA
Deshacer actualizaciones
Revisar diferencias entre versiones ("diff"s)
Generar logs de cambios iniciales desde bases de datos existentes
Generación de documentación de cambios de bases de datos

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 11
¿Cómo es la gestión con LiquiBase? (1/4)

No es una herramienta “diff”.


Trabaja de forma diferente a los tradicionales herramientas de
versionado de esquemas.
Almacena una lista de los cambios aplicados.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 12
¿Cómo es la gestión con LiquiBase? (2/4)

LiquiBase utiliza ficheros XML para describir los cambios


(changesets), lo que permite independencia del sistema de
BDD utilizado. Un changeset se identifica por su id y author,
así como por el propio nombre del fichero.

Cuando aplicamos un changeset, LiquiBase a parte de realizar


las modificaciones pertinentes, registra una entrada con el
cambio en su tabla de histórico DatabaseChangeLog. De
hecho, antes de aplicar un changeset, se comprueba con
dicha tabla que este no se ha realizado previamente.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 13
¿Cómo es la gestión con LiquiBase? (3/4)

LiquiBase utiliza dos tablas:

databasechangelock
Utilizada para controlar la concurrencia.

databasechangelog
Para el registro de cambios aplicados.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 14
¿Cómo es la gestión con LiquiBase? (4/4)

Ya que todos los cambios en la base de datos son almacenados en


un formato legible para los humanos (changesets), permite también
su seguimiento y control el sistema de control de versiones.

Podemos utilizar LiquiBase directamente como una herramienta de


comandos, o configurarla como un plugin de Ant o de Maven.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 15
Primeros pasos con LiquiBase (1/4)

1º – Definir el fichero Changelog


db.changelog.xml
<?xml version="1.0" encoding="UTF8"?>

<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">

</databaseChangeLog>

En este fichero es donde indicamos todos los cambios o Changesets.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 16
Primeros pasos con LiquiBase (2/4)

2º - Definir un Changeset.
db.changelog.xml
<?xml version="1.0" encoding="UTF8"?>

<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">

<changeSet id="1" author="pau">


<createTable tableName="producto">
<column name="id" type="int">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="nombre" type="varchar(50)">
<constraints nullable="false"/>
</column>
<column name="precio" type="double" />
<column name="baja" type="boolean" defaultValueBoolean="false"/>
</createTable>
</changeSet>

</databaseChangeLog>

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 17
Primeros pasos con LiquiBase (3/4)

3º – Aplicar el Changeset
Podemos ejecutar el Changeset de varias formas: mediante
linea de comandos, Ant, Maven, Grails, etc.
Por ejemplo desde linea de comandos contra una BDD
MySql.
java jar liquibase.jar driver=com.mysql.jdbc.Driver \
classpath=lib/mysql.jar \
changeLogFile=db.changelog.xml \
url="jdbc:mysql://localhost/db_example" \
username=user \
password=password \
logLevel=info \
update

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 18
Primeros pasos con LiquiBase (4/4)

4º – Revisar la BDD
Podemos revisar que el cambio se ha realizado en nuestra
BDD.
Y que este queda registrado en la tabla
databasechangelog.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 19
Buenas Prácticas (1/3)

Añadir comentarios a los changesets.

<changeSet id="2" author="pau">


<comment>Se añade columna descripcion a tabla producto</comment>
<alterTable tableName="producto">
<column name="descripcion" type="varchar(100)" />
</createTable>
</changeSet>

Seguir siempre el mismo criterio para los IDs. Puede ser un


numero (1), una fecha y numero (201204011), etc.

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 20
Buenas Prácticas (2/3)

Organizar los ChangeLogs.


Utilizar una estructura de directorios y nombres de fichero.

Utilizar includes en db.changelog.xml


<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">

<include file="tablas.changelog.xml" relativeToChangelogFile="true" />


<include file="datos.changelog.xml" relativeToChangelogFile="true" />

</databaseChangeLog>

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 21
Buenas Prácticas (3/3)

Utilizar el fichero de propiedades liquibase.properties


Nos evita tener que pasar los parámetros de conexión a la
BDD, en cada llamada a la herramienta liquibase.
driver=com.mysql.jdbc.Driver
classpath=lib/mysql.jar
changeLogFile=db.changelog.xml
url=jdbc:mysql://localhost/db_example
username=user
password=password
logLevel=info

De esta forma llamamos a liquibase indicando únicamente


la acción.

$ java jar liquibase update

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 22
Rolling Back de Cambios

Crear Tags “tag”


$ java jar liquibase tag v0.1

Deshacer todos los cambios hasta el Tag indicado “rollback”


$ java jar liquibase rollback v0.1

Deshacer todos los cambios hasta fecha “rollbackToDate”


$ java jar liquibase rollbackToDate '20120401'T'00:00:00'

Deshacer los últimos N cambios “rollbackCount”


$ java jar liquibase rollbackCount 1

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 23
Acciones de Refactoring disponibles (1/2)

LiquiBase permite definir todo tipo de modificaciones


mediante su sintaxis XML.
Add Column Create View
Rename Column Rename View
Modify Column Drop View
Drop Column Merge Columns
Alter Sequence Create Stored Procedure
Create Table Insert
Rename Table Etc ...
Drop Table

Imprescindible revisar la documentación oficial


www.liquibase.org/manual/refactoring_commands

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 24
Acciones de Refactoring disponibles (2/2)

También permite incluir cambios mediante ficheros SQL.


db.changelog.xml
<changeSet id="3" author="pau">
<comment>Se crea nueva tabla usuarios</comment>
<sqlFile path="sql/3create_usuarios.sql">
<rollback>
<dropTable tableName="usuarios"/>
</rollback>
</changeSet>

3-create_usuarios.sql

CREATE TABLE usuarios (


Id int PRIMARY KEY,
Nombre varchar(50)
);

Si utilizamos SQL, debemos encargarnos nosotros de indicar las acciones de rollback

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 25
Integración con Maven (1/2)

pom.xml
<plugins>
<! Liquibase Plugin >
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibasemavenplugin</artifactId>
<version>2.0.3</version>
<configuration>
<propertyFile>src/main/resources/liquibase/liquibase.properties</propertyFile>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
</configuration>
<executions>
<execution>
<phase>processresources</phase>
<goals>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>

http://www.liquibase.org/manual/maven

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 26
Integración con Maven (2/2)

Por defecto durante el build del proyecto maven llamará a


liquibase con la acción update.
Pero podemos invocar directamente al plugin para hacer uso
de otras acciones. Ejemplos:
$ mvn liquibase:update

$ mvn liquibase:rollback Dliquibase.rollbackCount=1

$ mvn liquibase:tag Dliquibase.tag=v2.0

$ mvn liquibase:help

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 27
Novedades en versión 2.0.4

Se esta trabajando ya en Liquibase 3.0.


La última versión estable es Liquibase 2.0.4, liberada el
pasado 19 de Abril.
Principalmente incluye correcciones de errores, pero entre las
nuevas funcionalidades podemos destacar la posibilidad de
insertar datos de tipo blob/clob.
<insert tableName="TEST_BLOB">
<column name="a_blob" valueBlob="imagen.png" />
</insert>

<insert tableName="TEST_CLOB">
<column name="a_clob" valueClob="texto.txt" />
</insert>

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 28
Referencias

http://www.liquibase.org
http://www.liquibase.org/quickstart
http://blog.liquibase.org
Liquibase - Gestión De Cambios En BDD
Getting the most out of LiquiBase
Liquibase – Maven plugin
Lintips

ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 29
Sobre el Autor:

Paulo Clavijo Esteban


Software Engineer en ISC
clavijo_pau@ingenieriadesoftware.com

Blog: www.lintips.com
Email: paucls@gmail.com

30