In einer App, die eine Datenbankmigration mit Gradle und Flyway durchführt Ich habe einen Versuch und Irrtum gemacht, als ich den Rückruf in Java schrieb.
Unter dem Strich sollten Sie die Callback-Klasse kompilieren, bevor Sie die Flyway-Task ausführen.
Den diesmal verifizierten Code finden Sie im folgenden Repository. https://github.com/mahaker/flyway-callback-java
Java: OpenJDK 11 Gradle: 5.2.1 flyway: 6.4.2 Postgres: 12
Erstellen Sie eine Klasse, die die Schnittstelle org.flywaydb.core.api.callback.Callback
implementiert
Setzen Sie die Eigenschaft flyway.callbacks auf einen vollständig qualifizierten Namen.
https://flywaydb.org/documentation/api/hooks#java-based-callbacks
Stellen Sie außerdem sicher, dass die Klassenaufgabe vor der Flyway-Aufgabe ausgeführt wird. * Dies ist wichtig </ b> (Um genau zu sein, ist es eine kompilierte Java-Aufgabe?)
FillTestData.java
package db.migration;
import java.sql.PreparedStatement;
import org.flywaydb.core.api.callback.Callback;
import org.flywaydb.core.api.callback.Context;
import org.flywaydb.core.api.callback.Event;
public class FillTestData implements Callback {
@Override
public boolean supports(Event event, Context context) {
return Event.AFTER_MIGRATE.equals(event);
}
@Override
public boolean canHandleInTransaction(Event event, Context context) {
return false;
}
@Override
public void handle(Event event, Context context) {
try (
final PreparedStatement statement = context
.getConnection()
.prepareStatement("INSERT INTO PERSON(ID, NAME, AGE) VALUES (1, 'userA', 20), (2, 'userB', 22)")
) {
statement.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
}
build.gradle
//Auszug nur was Sie brauchen
plugins {
id "org.flywaydb.flyway" version "6.4.2"
}
group 'org.example'
version '1.0-SNAPSHOT'
sourceCompatibility = 11
flyway {
url = 'jdbc:postgresql://localhost:15432/exampledb'
user = 'postgres'
password = 'example'
locations = [ 'filesystem:./src/main/resources/db/migration/' ]
callbacks = [ 'db.migration.FillTestData' ]
}
// !!Wichtig! !!
flywayClean.dependsOn(classes)
flywayMigrate.dependsOn(classes)
Wenn Sie die Migration ausführen, können Sie sehen, dass die Einfügeanweisung ausgeführt wurde.
Diese Methode wurde von einer Person innerhalb der Flugbahn gelehrt. https://github.com/flyway/flyway/issues/2829
Recommended Posts