Our Blog

Liquibase: Operaciones, buenas practicas e integración con Maven

En el post anterior hemos hecho hincapié en hacer una breve introducción de que es Liquibase, las características y como instalarlo en nuestra PC. En este post la idea es centrarnos en hacer una breve explicación de las distintas operaciones que se pueden realizar como así también las buenas practicas que nos pueden ayudar a organizar mejor los cambios en una estructura.

Operaciones

Existen múltiples operaciones que se pueden realizar con Liquibase, en este apartado veremos tan solo las mas importantes pero los invitamos a que vean todas las que se encuentran disponibles en este link.

Add Column

<changeSet id="2" author="teraswap">
	<comment>Se añade una nueva columna a la tabla categorias</comment> 
	<addColumn tableName="categoria">
		<column name="active" type="boolean"/>
	</addColumn>
</changeSet>

Drop Column

<changeSet id="3" author="teraswap">
	<comment>Se elimina una columna de la tabla categoria</comment> 
	<dropColumn columnName="active" tableName="categoria"/>
</changeSet>

Create Table

<changeSet id="4" author="teraswap">
	<comment>Se crea la nueva tabla usuario</comment> 
	<createTable tableName="usuario">
		<column name="name" type="varchar(50)"/>
		<column name="password" type="varchar(50)"/>
	</createTable>
</changeSet>

Drop Table

<changeSet id="5" author="teraswap">
	<comment>Se elimina la tabla usuarios</comment> 
	<dropTable cascadeConstraints="true" tableName="usuario"/>
</changeSet>

Insert

<changeSet id="6" author="teraswap">
	<comment>Se insertan registros en la tabla categoria</comment>
	<insert tableName="categoria">
		<column name="id" value="1"/>
		<column name="name" value="tera"/>
	</insert>

	<insert tableName="categoria">
		<column name="id" value="2"/>
		<column name="name" value="code"/>
	</insert> 

	<insert tableName="categoria">
		<column name="id" value="3"/>
		<column name="name" value="date"/>
	</insert> 
</changeSet>

Update

<changeSet id="7" author="teraswap">
	<comment>Se modifican registros en la tabla categoria</comment> 
	<update tableName="categoria">
		<column name="name" value="data"/>
		<where>name = 'date'</where>
	</update>
</changeSet>

Delete

<changeSet id="8" author="teraswap">
	<comment>Se eliminan registros en la tabla categoria</comment>
	<delete tableName="categoria">
		<where>name = 'code'</where>
	</delete>
</changeSet>

Buenas practicas

En este apartado explicaremos algunas de las buenas practicas que son recomendables a la hora de usar esta libreria, cabe resaltar que no son todas sino tan solo las mas importantes.

Añadirle un comentario a cada changeSet

La idea es poder identificar cual fue el motivo o que es lo que implico cada uno de los changeSet, esta información se almacena dentro de una columna en la tabla databasechangelog.

<changeSet id="1" author="teraswap">
	<comment>Se crea una nueva tabla: categoria</comment> 
	<createTable tableName="categoria">
	    <column name="id" type="int">
		    <constraints primaryKey="true" nullable="false"/>
	    </column>
	    <column name="name" type="varchar(50)">
		    <constraints nullable="false"/>
	    </column>
	</createTable>
</changeSet>

Separar los cambios en distintos archivos

Este punto es recomendable cuando se trabaja en una aplicación por versiones o si se trabaja con metodologías ágiles separando los cambios por sprints ya que nos permite saber que cambios están relacionados con una versión mas fácilmente.

Para hacer esto deberemos tener un archivo XML (db.master.changelog.xml) que sera el maestro y el que contenga todas las referencias al resto de los archivos

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

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
	
	<include file="changelog/db.changelog-1.0.xml"/> 
</databaseChangeLog>

Cada uno de los archivos que contengan los cambios desconocerán la existencia del changeLog maestro (como si fueran ellos el changeLog maestro), lo que nos permite que podamos ejecutar si queremos ese único archivo por separado. El siguiente es un ejemplo de como se ve el changeLog que realiza cambios en la base de datos (db.changelog-1.0.xml):

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

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

Organizar los archivos

Una buena practica con el uso de Liquibase es mantener organizado los cambios dentro de una estructura de carpetas, existen varias alternativas en particular para lo que son proyectos Java una alternativa podría ser la siguiente:

src
  resources
    db
      db.changelog-master.xml
      changelog
        db.changelog-1.0.xml
        db.changelog-1.1.xml
        db.changelog-2.0.xml

Tambien podria  incluirse el archivo db.changelog-master.xml dentro de la carpeta changelog.

Utilizar un archivo de configuración

Como hemos visto en el post anterior la forma de ejecutar Liquibase por linea de comandos es pasandole todos los parámetros (url de la base de datos, driver, usuario, contraseña), ahora bien esto hace que el comando sea engorroso y largo. Una buena practica es extraer toda esa configuración dentro de un archivo llamado liquibase.properties el cual por default debería estar en el mismo directorio que donde se encuentra nuestro changeLog master (el que posee las referencias al resto de los archivos).

El archivo tendría aproximadamente la siguiente información:

driver=com.mysql.jdbc.Driver
classpath=lib/mysql-connector-java-5.1.34-bin.jar
changeLogFile=db.master.changelog.xml
url=jdbc:mysql://localhost/exampleLiquibase
username=usuario
password=contraseña
logLevel=info

Hacer un tag para marcar el estado actual

Otra buena practica es realizar un tag (marcar el estado actual de la base de datos) para luego poder restaurarla a ese estado, este comando a su vez cuando es ejecutado almacena ese tag creando un registro en la tabla databasechangelog.

liquibase tag nombreTag

Una vez hecho esto tenemos un punto de restauración dentro de nuestra base de datos y que en caso de querer revertir todos los cambios hasta un tag puntual lo único que deberemos hacer es ejecutar lo siguiente:

liquibase rollback v0.1

Integración con Maven

La integración de esta librería con Maven (esto es solo para proyectos Java) es bastante sencilla, solo deberemos agregar a nuestro archivo pom.xml lo siguiente

<project>
    <build>
      <plugins>
		<plugin>
		   <groupId>org.liquibase</groupId>
		   <artifactId>liquibase-maven-plugin</artifactId>
		   <version>3.0.5</version>
		   <configuration>                  
			  <propertyFile>src/main/resources/liquibase/liquibase.properties</propertyFile>
		   </configuration>                
		   <executions>
			 <execution>
			   <phase>process-resources</phase>                                                                  
			   <goals>
				 <goal>update</goal>
			   </goals>
			 </execution>
		   </executions>
		</plugin> 	
      </plugins>
    </build>
  </project>

Siguiendo las buenas practicas de Liquibase los datos de la conexión, usuario y contraseña se encuentran en un archivo (liquibase.properties).

La forma de invocar a la librería para que se encargue de ejecutar los cambios es la siguiente:

 mvn liquibase:update

Conclusión

Liquibase nos brinda grandes beneficios ya que posee un gran numero de operaciones SQL que son soportadas en casi todas las base de datos y con el correcto uso nos facilitara mucho nuestros trabajo de actualizar la base de datos.

Por ultimo para los que quieran poder ver el código y probar este ejemplo les dejamos este link.

No comments
TeraswapLiquibase: Operaciones, buenas practicas e integración con Maven

Related Posts