Flyway is a popular database migration tool that is commonly used in JVM environments.

Quarkus provides first class support for using Flyway in native mode as will be explained in this guide.

You only need to add this extension if you are doing native compilation with Quarkus. Otherwise, you can use Flyway by just adding it as a dependency in the pom.xml and run the Quarkus app in JVM mode.

Setting up native compilation support for Flyway

To get native compilation working in Quarkus with Flyway, you just need to:

  • add your migrations to the src/main/resources/db/migration folder as you usually do with Flyway

The migrations location is not configurable in native mode. The Flyway extension will always look for migrations in the default path.
  • create your Flyway object and run your migration as you normally do

In your pom.xml, add the following dependencies:

  • the Flyway extension

  • your JDBC driver extension (quarkus-jdbc-postgresql, quarkus-jdbc-h2, quarkus-jdbc-mariadb, …​)

<dependencies>
    <!-- Flyway specific dependencies -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-flyway</artifactId>
    </dependency>

    <!-- JDBC driver dependencies -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-jdbc-postgresql</artifactId>
    </dependency>
</dependencies>

You can use MP-config to get any relevant configuration properties you may need by adding them to the application.properties file.

# configure your datasource
datasource.url: jdbc:postgresql://localhost:5432/mydatabase
datasource.username: sarah
datasource.password: connor

Note that you can use any name for these configuration properties.

Add a SQL migration to the default folder following the Flyway naming conventions: src/main/resources/db/migration/V1.0.0__Quarkus.sql

CREATE TABLE quarkus
(
  id   INT,
  name VARCHAR(20)
);
INSERT INTO quarkus(id, name)
VALUES (1, 'QUARKED');

Now you can create your Flyway object as you usually do:

@ApplicationScoped
public class MigrationService {

    @ConfigProperty(name = "datasource.url") (1)
    String dbURL;
    @ConfigProperty(name = "datasource.username")
    String dbUser;
    @ConfigProperty(name = "datasource.password")
    String dbPassword;

    public void migrate() {
        Flyway flyway = Flyway.configure()
                        .dataSource(dbURL, dbUser, dbPassword)
                        .load(); (2)
        flyway.migrate();
    }
}
1 Inject your config properties as needed
2 Create the Flyway object and enjoy