H2 und Flyway Incompability

chris080

Mitglied
In meinem Projekt verwende ich Flyway-Core (6.4.4) für meine Migrationen und für meine Tests eine H2-in-memory Datenbank (2.2.224).

Ich will nämlich in meiner in-memory Datenbank für meine Tests die exakt gleiche Datenbank- und Tabellenstruktur wie im Produktivsystem. Und ich will das natürlich nicht für jede Testklasse manuell aufziehen. Vor allem, weil bei Änderungen diese manuell nachgezogen werden müssten.
Also dachte ich, ich verwende die Flyway-Migrationen dafür.

Java:
FluentConfiguration fluentConfiguration = Flyway.configure()
            .dataSource(url, user, password)
try {
    Flyway flyway = fluentConfiguration.load();
    flyway.clean(); //Hier fliegt er raus
    flyway.migrate();
    System.out.println("Migration complete");
} catch (FlywayException exception) {
    //Exception
}

Sobald ich auf meine Flyway-Instanz zugreifen möchte (also bei flyway.clean()) fliegt er raus und gibt mir die Exception:
Code:
org.flywaydb.core.internal.exception.FlywaySqlException:
Unable to determine H2 compatibility mode
-----------------------------------------
SQL State  : 42001
Error Code : 42001
Message    : Syntax error in SQL statement "SELECT [*]VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME = 'MODE'"; expected "TOP, DISTINCT, ALL, *, INTERSECTS, NOT, EXISTS, UNIQUE, INTERSECTS"; SQL statement:
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME = 'MODE' [42001-212]

Und sie hilft mir einfach absolut gar nicht. Es scheint Probleme mit irgendwelchen Queries von H2 oder Flyway zu geben. Alles googlen hat mir nichts gebracht oder ich habe nicht genug Verständnis von dem Ganzen, um die Lösung zu erkennen, wenn ich sie lese.

Ich hoffe es gibt hier jemdenn, der weiß, was man da tun muss.
 

Marinek

Bekanntes Mitglied
Hi,

woher kommt den diese Query? Das sieht nicht so aus, als käme es von Flayway, weil wieso sollte man ein Select da drin haben.

Wie dem auch seit: Es wird select [*] gemacht. Die Klammern sind hier falsch und müssen weg.

Finde heraus woher die SQL kommt und behebe den Fehler.

Schöne Grüße
Martin
 

mihe7

Top Contributor
Ich hoffe es gibt hier jemdenn, der weiß, was man da tun muss.
Ich kann Dir sagen, was ich tun würde: die Fehlermeldung (Unable to determine H2 compatibility mode) in Google eintippen und dem ersten Ergebnis folgen:

 

chris080

Mitglied
Ah sorry ja habe es auch versucht. Zwischenzeitig ging es nicht. Ich musste erst herausfinden, dass ab Flyway 8.2.1 ein Problem entsteht und habe dann in den Release Notes reingesehen und dort stand, dass noch eine weitere Dependency
Java:
implementation 'org.flywaydb:flyway-mysql:8.4.4'
rein muss.
Jetzt bekomme ich aber eine neue Fehlermeldung:

Code:
org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException: Migration V0_0__initial_config.sql failed
-----------------------------------------
SQL State  : 42001
Error Code : 42001
Message    : Syntax error in SQL statement "ALTER [*]DATABASE prf2 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"; expected "TABLE, USER, INDEX, SCHEMA, SEQUENCE, VIEW, DOMAIN"; SQL statement:
ALTER DATABASE prf2 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin [42001-212]
Location   : db/migration/V0_0__initial_config.sql (/workspaces/prf2-webapp-2/build/resources/main/db/migration/V0_0__initial_config.sql)
Line       : 1
Statement  : ALTER DATABASE prf2 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

Und das ist komisch, weil meine erste Migration gar kein "[*]" beinhaltet.
 

chris080

Mitglied
Aber du möchtest doch eine H2 Datenbank?

Wieso dann MySQL Abhängigkeit?
Achso ja diese neue Dependency war wohl vorher bei Flyway V8.2.0 und davor automatisch verbaut. Und ab V8.2.1 muss man das wohl manuell einpflegen. Ging ohne nicht, geht jetzt mit. Und im Produktivsystem verwende ich auch mit mariaDB SQL. Also das ist sogesehen nur notwendig, um es allgemein mit Flyway >V8.2.0 zum Laufen zu bekommen.

Aber scheinbar kann man in H2 kein ALTER DATABASE anwenden, oder interpretiere ich die Fehlermeldung falsch? Denn bei den Migrationen fürs die DB vom Produktivsystem gibt es dieses Problem nicht. Also kommt Flyway damit wohl klar.
 

Marinek

Bekanntes Mitglied
Achso das [*] zeigt vermutlich auf den möglichen Fehler ;).


H2 hat kein ALTER DATABASE

Es ist ehh fraglich, inweit man Tests auf Datenbank A macht und später das Programm auf Datenbank B läuft. Würde ich also eher versuchen die gleiche DB zu verwenden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Flyway Versionierung Datenbankprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben