Flyway: cómo integrar en Maven

0
6945

Cómo integrar Flyway en Maven para realizar una migración/carga inicial de base de datos.

Índice de contenidos

1. Introducción

Cuando tenemos que replicar un entorno en un equipo, o estamos realizando la configuración inicial de nuestra aplicación en un servidor en el que estamos desplegándola, tenemos que realizar una minuciosa labor de configuración de la base de datos.
Mediante Flyway podemos automatizar todos estos pasos en un script SQL para homogeneizar la configuración y evitar fallos por despistes.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro Retina 15″ (2.2 Ghz Intel Core I7, 16GB DDR3).
  • Sistema Operativo: Mac OS Yosemite 10.10
  • Entorno de desarrollo: IDEA IntelliJ 16.01 EAP
  • Maven 3.3.9
  • Flyway 4.0
  • PostgreSQL 9.5.1

3. Creación del proyecto con Maven

Primero crearemos un proyecto Maven para incluir el plugin de Flyway. También necesitaremos especificar las dependencias del mismo, así como la configuración de acceso a base de datos.
Para especificar la configuración tenemos distintas opciones cuyo orden es el siguiente:

  1. A través de propiedades del sistema
  2. Utilizando un fichero externo
  3. Mediante propiedades Maven
  4. Directamente a nivel de plugin

Estas se pueden utilizar de manera simultánea, ya que al encontrar una de mayor nivel, se ignorarán las siguientes.

En nuestro caso utilizaremos un fichero externo de configuración. Se puede ampliar la información al respecto en la documentación oficial para Maven y su configuración en la goal flyway:migrate.
Como opción adicional, se nos permite especificar en el fichero settings.xml de Maven la configuración de credenciales de manera independiente del proyecto.

3.1 Configuración del plugin

Deberemos tener creada la base de datos a la que nos vayamos a conectar para incluir la url de conexión a la misma, y en nuestro caso, la referencia al usuario que vamos a utilizar para conectarnos.

	<build>
        <plugins>
            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>4.0</version>
                <configuration>
                    <url>jdbc:postgresql://localhost:5432/TutorialFlyway</url>
                    <user>flyway</user>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.postgresql</groupId>
                        <artifactId>postgresql</artifactId>
                        <version>9.4.1208.jre7</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

El nombre del fichero properties que Flyway va a buscar por defecto es flyway.properties, y lo busca en el mismo directorio en que se ubica nuestro pom.xml, es decir, el directorio raíz. También se le puede indicar la ruta al mismo en la configuración del plugin. En este archivo especificaremos las credenciales para conectarnos a la base de datos, los esquemas que se van a ver afectados y el resto de propiedades que necesitemos. Como ejemplo tenemos:

flyway.user=flyway
flyway.password=flyway

3.2 Creación del script SQL

Flyway utiliza un prefijo para determinar el orden en el que se ejecutarán los scripts, por lo que podremos sin problema crear los elementos en el orden requerido previamente a rellenar los datos. La estructura de nombres está prefijada de acuerdo al siguiente patrón por defecto (configurable):

  • prefijo:
    • V: script con versionado
    • R: script repetible, independiente de la versión
  • versión: numérico, separado por guión bajo o puntos, con tantos niveles como se requieran
  • separador: por defecto configurado como dos guiones bajos (__)
  • descripción: podremos utilizar guiones bajos o espacios para separar las palabras
  • extensión: por defecto, buscará la extensión .sql

Flyway los colocará ordenados por versión y procederá a ejecutarlos secuencialmente. En nuestro caso, creamos dos ficheros, V1__Create_Table.sql y V1.1__Insert_Records.sql bajo la carpeta /src/main/resources/db/migration.

CREATE TABLE "flyway_test_table" (
ID SERIAL PRIMARY KEY,
FIRSTNAME varchar(255) default NULL,
LASTNAME varchar(255) default NULL,
MAIL varchar(255) default NULL
);

Para la creación de los datos he recurrido a una herramienta de generación automática para obtener 100 registros con datos: Generate Data

Flyway utiliza un mecanismo de escaneado recursivo, incluyendo subcarpetas, para localizar los scripts a cargar a partir de la localización que le indiquemos por parámetro al plugin. Si no le indicamos ninguna, por defecto utilizará filesystem:src/main/resources/db/migration.

4. Ejecución

Ejecutar Flyway es tan sencillo como: mvn flyway:<goal>, donde <goal> en nuestro caso va a ser migrate.

Yairs-MacBook-Pro:TutorialFlyway ysegura$ mvn flyway:migrate
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building TutorialFlyway 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- flyway-maven-plugin:4.0:migrate (default-cli) @ TutorialFlyway ---
[INFO] Flyway 4.0 by Boxfuse
[INFO] Database: jdbc:postgresql://localhost:5432/TutorialFlyway (PostgreSQL 9.5)
[INFO] Successfully validated 2 migrations (execution time 00:00.007s)
[INFO] Creating schema "public" ...
[INFO] Creating Metadata table: "public"."schema_version"
[INFO] Current version of schema "public": 0
[INFO] Migrating schema "public" to version 1 - Create Table
[INFO] Migrating schema "public" to version 1.1 - Insert Records
[INFO] Successfully applied 2 migrations to schema "public" (execution time 00:00.082s).
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.555 s
[INFO] Finished at: 2016-04-01T09:55:51+02:00
[INFO] Final Memory: 10M/309M
[INFO] ------------------------------------------------------------------------
Yairs-MacBook-Pro:TutorialFlyway ysegura$

Ya tenemos la base de datos creada, los registros insertados, y todas las operaciones indicadas en nuestros scripts finalizadas.

5. Conclusiones

Siempre que en nuestros proyectos utilicemos bases de datos, necesitaremos utilizar un script para crear nuestra base de datos, insertar datos iniciales, etc. y deberíamos pensar en incorporar Flyway, ya que es realmente sencillo, y nos permite ejecutar de manera estructurada esos scripts. Además, todos aquellos que colaboren en el proyecto pueden replicar la configuración con un mínimo coste, y sin que suponga trabajo adicional…

The Concept Of One: Do It Once, Do It Right, And Use It Everywhere

6. Referencias

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad