Skip to content

Flyway Concepts

Every exported resource declaration becomes a section in the generated flyway.toml. The serializer handles the translation automatically:

Flyway TOML has four top-level namespaces:

NamespaceChant TypeDescription
Root levelFlywayProjectProject metadata (id, name, databaseType)
[flyway]FlywayConfigGlobal migration settings
[environments.<name>]EnvironmentPer-environment connection config
[flywayDesktop]FlywayDesktopConfigFlyway Desktop IDE settings
[redgateCompare]RedgateCompareConfigRedgate Compare options

Flyway supports secret resolvers that inject credentials at runtime:

import { Environment, VaultResolver, resolve } from "@intentius/chant-lexicon-flyway";
export const vault = new VaultResolver({
url: "https://vault.example.com",
token: "${env.VAULT_TOKEN}",
engineName: "secret",
engineVersion: "v2",
});
export const prod = new Environment({
url: resolve("vault", "db-url"),
user: resolve("vault", "db-user"),
password: resolve("vault", "db-password"),
schemas: ["public"],
displayName: "prod",
});

This generates:

[environments.prod]
url = "${vault.db-url}"
user = "${vault.db-user}"
password = "${vault.db-password}"
schemas = ["public"]
[environments.prod.resolvers.vault]
url = "https://vault.example.com"
token = "${env.VAULT_TOKEN}"
engineName = "secret"
engineVersion = "v2"

Flyway v10+ supports per-environment flyway settings via [environments.<name>.flyway] sections. These override the global [flyway] settings for a specific environment:

import { Environment } from "@intentius/chant-lexicon-flyway";
export const prod = new Environment({
url: "jdbc:postgresql://prod:5432/db",
schemas: ["public"],
displayName: "prod",
flyway: {
validateOnMigrate: true,
cleanDisabled: true,
placeholders: { logLevel: "warn" },
},
});

This generates:

[environments.prod]
url = "jdbc:postgresql://prod:5432/db"
schemas = ["public"]
[environments.prod.flyway]
validateOnMigrate = true
cleanDisabled = true
[environments.prod.flyway.placeholders]
logLevel = "warn"

The environmentGroup() composite makes this pattern even easier by deep-merging shared config into per-environment overrides — see the Examples page.

Provisioners automate environment setup:

ProvisionerUse Case
cleanClean shadow databases before migration
dockerSpin up database containers for dev
backupRestore from backup before applying
snapshotRestore from snapshot
createdbCreate database if it doesn’t exist