In this era of continuous integration and automated refactoring to database development, we need techniques of evolutionary database design. Tools like Liquibase and Flyway follow these techniques and provide an iterative development approach. In this article, we will study the differences and similarities between Liquibase and Flyway.
Note that no tool is perfect for all the use cases. Each tool is strong in its own place.
2. Similarities Between Liquibase and Flyway
Since Liquibase and Flyway implement the design principles of the evolutionary database they offer a lot of similar functionality. Both tools:
- Are open-source to an extent and help manage, track and deploy database schema changes.
- Use a versioned migration approach to a database schema change.
- Are based on Java and provides extensive support for Java frameworks like Spring Boot and Vert.x.
- Support integration with build tools like Maven and Gradle.
- Can run independently from the command line through provided scripts.
- Support a wide variety of databases.
Now we will discuss the differences between the offerings of these tools.
3. Differences Between Liquibase and Flyway
3.1. Defining a Change
Flyway uses SQL for defining a change. On the other hand, Liquibase provides flexibility to specify a change in different formats including SQL such as XML, YAML, and JSON. With Liquibase we can work with database-agnostic languages and easily apply schema changes to different database types.
Flyway is built around a linear database versioning system that increments on each versioned change. This sometimes can create conflicts with parallel development. The filename of a Flyway script defines the type of migration. For example, a migration should have a convention of prefixes as V (for versioned), U (for undo), and R (for repeatable). It will be followed by a version number and a separator __(two underscores) followed by a description and a suffix .sql such as V01__Add_New_Column.sql.
Liquibase migration doesn't need to follow any of the file name conventions. In Liquibase, changes are managed by one ledger known as a master changelog which will be defined as including all the migrations.
3.2. Storing a Change
Both the tools store the deployed change in a table. Flyway migrations are stored in the database schema with a default table named flyway_schema_history. Similarly, Liquibase stores its deployed migrations in a table named databasechangelog. Both the tools support overriding default configuration to change the table name.
3.3. Execution Order of a Change
Managing the order of a change is comparatively difficult in Flyway. With Flyway, the order depends on the version number and migration type in the filename. Contrarily, Liquibase uses a separate file named master_changelog in which the changes are deployed in the order they are defined.
3.4. Rollback a Change
Now, let's discuss one of the main aspects of database migration. Rollback is needed whenever a bad change has caused a catastrophic issue in the application. Liquibase provides a way to roll back everything or undo specific migrations (available only on paid versions).
Flyway also has a undo migration, which can be deployed with a file name that starts with U followed by the version that needs to be undone. But this feature is only available in its paid version.
Both the tools offer a decent rollback functionality, but considering only the free version, Flyway offers a good-to-use solution.
3.5. Selective Deployment of a Change
There are use cases where we need to deploy a change to only one environment. Liquibase wins here when we've to selectively deploy a change. Flyway is also capable of doing it, but you would have to set up a different configuration file for each environment or database. With Liquibase we can easily add labels and contexts to ensure deployment in certain places.
3.6. Java-Based Migration
Although both the tools are strongly Java Oriented, Only Flyway provides Java-based migration. Flyway allows defining a migration within a Java file. This can be advantageous in some scenarios.
3.7. Snapshots & Comparing Databases
Liquibase allows users to take a snapshot of the current state of the database. We can use this state to compare it to another database. This would be very helpful in scenarios like failover and database replication. Flyway on the other hand doesn't support any of the snapshot features.
3.8. Conditional Deployment
Liquibase offers an added feature called pre-conditions. Preconditions allow users to apply changes based on the current state of the database. A changeset will only execute if it passes these preconditions.
Flyway on the other hand doesn't support this. But through procedures, we can apply conditions in most SQL-based databases.
In this article, we compared two of the most used database migration tools Liquibase and Flyway. There are always tradeoffs to make when choosing between tools. There are no strong drawbacks or advantages either of the tools have when compared to one another. You can pick either Liquibase or Flyway based on your application needs and check most of the boxes.