Spring:Flyway: Unterschied zwischen den Versionen
Aus Alexander's Wiki
Admin (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Flyway in SpringBoot-Projekt == In pom.xml<syntaxhighlight lang="xml"> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifac…“) |
Admin (Diskussion | Beiträge) |
||
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 26: | Zeile 26: | ||
== Flyway in maven-Skript == | == Flyway in maven-Skript == | ||
flyway.conf in | |||
* ''installDir/conf/flyway.conf'' | |||
* ''userhome/flyway.conf'' | |||
* ''workingDir/flyway.conf'' | |||
<syntaxhighlight lang="properties"> | |||
# Settings are simple key-value pairs | |||
flyway.key=value | |||
# Single line comment start with a hash | |||
# Long properties can be split over multiple lines by ending each line with a backslash | |||
flyway.locations=filesystem:my/really/long/path/folder1,\ | |||
filesystem:my/really/long/path/folder2,\ | |||
filesystem:my/really/long/path/folder3 | |||
# These are some example settings | |||
flyway.url=jdbc:mydb://mydatabaseurl | |||
flyway.schemas=schema1,schema2 | |||
flyway.placeholders.keyABC=valueXYZ | |||
</syntaxhighlight>Befehle:<syntaxhighlight lang="bash" line="1"> | |||
mvn flyway:info | |||
mvn flyway:migrate | |||
mvn flyway:repair | |||
mvn compile flyway:migrate -D'flyway.configFiles'=${project.build.directory}/target/classes/configs/lea-dev-plateg.conf | |||
</syntaxhighlight> | |||
== Flyway callbacks == | |||
<syntaxhighlight lang="java"> | |||
package de.itzbund.egesetz.bmi.lea.persistence; | |||
import lombok.extern.log4j.Log4j2; | |||
import org.flywaydb.core.api.callback.Callback; | |||
import org.flywaydb.core.api.callback.Context; | |||
import org.flywaydb.core.api.callback.Event; | |||
import java.sql.Connection; | |||
import java.sql.ResultSet; | |||
import java.sql.SQLException; | |||
import java.sql.Statement; | |||
@Log4j2 | |||
public class FlywayCallback implements Callback | |||
{ | |||
private static final String CLEANUP_FAILED_MIGRATIONS = "DELETE FROM flyway_schema_history WHERE success = 0;"; | |||
private static final String GET_FAILED_MIGRATIONS = "SELECT count(*) FROM flyway_schema_history WHERE success = 0;"; | |||
@Override | |||
public boolean supports(Event event, Context context) | |||
{ | |||
// case BEFORE_VALIDATE no more necessary | |||
return false; | |||
} | |||
@Override | |||
public boolean canHandleInTransaction(Event event, Context context) | |||
{ | |||
return false; | |||
} | |||
@Override | |||
public void handle(Event event, Context context) | |||
{ | |||
switch (event) | |||
{ | |||
case BEFORE_VALIDATE: | |||
repairFailedMigrations(context.getConnection()); | |||
break; | |||
default: | |||
} | |||
} | |||
private void repairFailedMigrations(Connection connection) | |||
{ | |||
if (connection != null) | |||
{ | |||
if (getFailedMigrations(connection) > 0) | |||
{ | |||
try (Statement statement = connection.createStatement()) | |||
{ | |||
statement.execute(CLEANUP_FAILED_MIGRATIONS); | |||
} catch (SQLException e) | |||
{ | |||
log.debug("Got Exception while cleanup flyway {}, but will continue.", e); | |||
} | |||
} else | |||
{ | |||
log.debug("No failed migrations detected."); | |||
} | |||
} else | |||
{ | |||
log.debug("Connection is null"); | |||
} | |||
} | |||
private int getFailedMigrations(Connection connection) | |||
{ | |||
int fails = 0; | |||
try (Statement statement = connection.createStatement()) | |||
{ | |||
ResultSet rs = statement.executeQuery(GET_FAILED_MIGRATIONS); | |||
if (rs != null) | |||
{ | |||
rs.next(); | |||
fails = rs.getInt(1); | |||
log.debug("{} previous failed scripts where found. We will cleanup.", fails); | |||
} | |||
} catch (SQLException e) | |||
{ | |||
log.debug("Got Exception while getting informations on flyway {}, but will continue.", e); | |||
} | |||
return fails; | |||
} | |||
@Override | |||
public String getCallbackName() | |||
{ | |||
return FlywayCallback.class.getSimpleName(); | |||
} | |||
} | |||
</syntaxhighlight> |
Aktuelle Version vom 25. August 2022, 07:52 Uhr
Flyway in SpringBoot-Projekt
In pom.xml
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>${flyway.version}</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
<version>${flyway.version}</version>
</dependency>
In application.yaml
spring:
flyway:
enabled: true
baselineOnMigrate: true
check-location: true
# schemas: public
# unfortunately flyway cannot distinct between mysql and mariadb by {vendor}
locations: classpath:db/migration/{vendor},classpath:db/migration/all #, filesystem:/opt/migration/{vendor}
user: user
password: password
Flyway in maven-Skript
flyway.conf in
- installDir/conf/flyway.conf
- userhome/flyway.conf
- workingDir/flyway.conf
# Settings are simple key-value pairs
flyway.key=value
# Single line comment start with a hash
# Long properties can be split over multiple lines by ending each line with a backslash
flyway.locations=filesystem:my/really/long/path/folder1,\
filesystem:my/really/long/path/folder2,\
filesystem:my/really/long/path/folder3
# These are some example settings
flyway.url=jdbc:mydb://mydatabaseurl
flyway.schemas=schema1,schema2
flyway.placeholders.keyABC=valueXYZ
Befehle:
mvn flyway:info
mvn flyway:migrate
mvn flyway:repair
mvn compile flyway:migrate -D'flyway.configFiles'=${project.build.directory}/target/classes/configs/lea-dev-plateg.conf
Flyway callbacks
package de.itzbund.egesetz.bmi.lea.persistence;
import lombok.extern.log4j.Log4j2;
import org.flywaydb.core.api.callback.Callback;
import org.flywaydb.core.api.callback.Context;
import org.flywaydb.core.api.callback.Event;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
@Log4j2
public class FlywayCallback implements Callback
{
private static final String CLEANUP_FAILED_MIGRATIONS = "DELETE FROM flyway_schema_history WHERE success = 0;";
private static final String GET_FAILED_MIGRATIONS = "SELECT count(*) FROM flyway_schema_history WHERE success = 0;";
@Override
public boolean supports(Event event, Context context)
{
// case BEFORE_VALIDATE no more necessary
return false;
}
@Override
public boolean canHandleInTransaction(Event event, Context context)
{
return false;
}
@Override
public void handle(Event event, Context context)
{
switch (event)
{
case BEFORE_VALIDATE:
repairFailedMigrations(context.getConnection());
break;
default:
}
}
private void repairFailedMigrations(Connection connection)
{
if (connection != null)
{
if (getFailedMigrations(connection) > 0)
{
try (Statement statement = connection.createStatement())
{
statement.execute(CLEANUP_FAILED_MIGRATIONS);
} catch (SQLException e)
{
log.debug("Got Exception while cleanup flyway {}, but will continue.", e);
}
} else
{
log.debug("No failed migrations detected.");
}
} else
{
log.debug("Connection is null");
}
}
private int getFailedMigrations(Connection connection)
{
int fails = 0;
try (Statement statement = connection.createStatement())
{
ResultSet rs = statement.executeQuery(GET_FAILED_MIGRATIONS);
if (rs != null)
{
rs.next();
fails = rs.getInt(1);
log.debug("{} previous failed scripts where found. We will cleanup.", fails);
}
} catch (SQLException e)
{
log.debug("Got Exception while getting informations on flyway {}, but will continue.", e);
}
return fails;
}
@Override
public String getCallbackName()
{
return FlywayCallback.class.getSimpleName();
}
}