Estoy intentando configurar la vía de migración para trabajar con dos proveedores - uno (H2) es para el medio ambiente local, y otro (MySQL) se da al CI.
Aquí está mi parche de secuencias de comandos:
Mi configuración de la vía de migración de frijol:
@Bean(initMethod = "migrate")
Flyway flyway() {
Flyway flyway = Flyway
.configure()
.dataSource(dataSource(dataSourceProperties()))
.locations("classpath:db/migration/MySQL", "classpath:db/migration/H2")
.load();
return flyway;
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("spring.datasource")
public HikariDataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().type(HikariDataSource.class)
.build();
}
Y la configuración de mi application.yml:
spring:
main:
allow-bean-definition-overriding: true
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/messages
username: username
password: password
Lo que trato de lograr es hacer que los scripts de base de datos de proveedores específicos dirigidos ruta de vuelo, dependiendo de qué base de datos se encuentra en el origen de datos. Esto es lo que sale:
Caused by: org.flywaydb.core.api.FlywayException: Found more than one migration with version 1.1
Offenders:
-> C:\Projects\my-project\out\production\resources\db\specific\MySQL\V1_1__Create_table_message.sql (SQL)
-> C:\Projects\my-project\out\production\resources\db\specific\H2\V1_1__Create_table_message.sql (SQL)
Ya lo he intentado utilizar nombres de proveedores minúsculas (db / migración / MySQL ...) y el uso db / específico / en lugar de db / migración. Nada funcionó para mí.
El problema es el consumo de:
.locations("classpath:db/migration/MySQL", "classpath:db/migration/H2")
Esto añadirá dos migraciones a la ruta en tiempo de ejecución. Esto es lo que causa el problema, porque Esto indica a la vía de migración de configuración para utilizar siempre los guiones de ambos lugares, en lugar de sólo utilizar los guiones para H2 H2 y las secuencias de comandos de MySQL para MySQL.
En su lugar, sólo se debe agregar la ruta específica para el conductor activa en el camino.
Algo como
String driverVendor = ..; // something to decide h2 or mysql
Flyway flyway = Flyway
.configure()
.locations("classpath:db/migration/" + driverVendor)
Es posible que necesite a minúsculas los nombres de las carpetas, es decir H2
a h2
y MySQL
que mysql
para que esto funcione.
Alternativamente, considerar el uso de primavera Boots Flyway auto-configuración en lugar de codificar la configuración Flyway en el código. Esto le permite definir la ruta en la configuración de aplicaciones como:
spring.flyway.locations=classpath:db/migration/{vendor}
Cuando {vendor}
se rellena automáticamente con el nombre del proveedor del conductor utilizado para conectar.
Ver también Ejecutar la ruta migratoria Las migraciones de bases de datos al iniciar