liquibase.database.Database
Overview
The liquibase.database.Database
interface acts as the "dialect" definition and facade for interacting with the database. It defines methods for:
- Reading metadata about the database (
getDatabaseMajorVersion()
,getDefaultPort()
,getDefaultSchema()
, etc.) - Checking capabilities of the database (
isCaseSensitive()
,supportsInitiallyDeferrableColumns
,supportsSchemas()
, etc.) - Performing common logic (
escapeObjectName()
,commit()
,rollback()
, etc.)
Each supported database within Liquibase will have its own Database implementation, such as liquibase.database.core.MySQLDatabase
.
Databases that are generally compatible with another database should have their Database implementation extend the other Database class.
For example, Reshift is PostgreSQL compatible and so the RedshiftDatabase
class extends PostgresDatabase
.
Any code that has to behave differently for different database types, will use an if (database instanceof PostgresDatabase)
pattern to determine the "dialect".
By having compatible databases such as Redshift extend the base class like PostgresqlDatabase
, all the existing "instanceof PostgresDatabase" checks will continue to work
and in any cases where Redshift does work differently, a new if (database instanceof RedshiftDatabase)
check can be added.
Database Selection
Liquibase uses the isCorrectDatabaseImplementation method to determine which Database implementations are valid for a given connection.
Generally, the logic in that method will check getDatabaseProductName()
, but depending on the database other connection metadata may need to be inspected as well.
For all the Database instances that are valid, Liquibase will use the one with the highest priority value.
API Highlights
Auto-Registration
Changes are dynamically discovered, so must have a no-arg constructor and be registered in META-INF/services/liquibase.database.Database
.
getPriority()
Used in selecting the instance to use.
getShortName()
The "short name" for the database is the unique, all-lowercase alphanumeric identifier for the database. For example oracle
or mysql
.
This is the key used in the dbms
tag among other places.
isCorrectDatabaseImplementation()
Used in selecting the instance to use for a given connection.
This function can check whatever information best identifies the database from the connection. For example, you can check getDatabaseProductName()
on the DatabaseConnection
.
Tip
Some "compatible" databases may identify themselves as the "standard" database in getDatabaseProductName()
.
In those cases, it may need to also check DatabaseConnection.getDatabaseProductVersion()
, getURL()
, or whatever other calls can most efficiently identify the database.
getDefaultDriver
Return the class name of the default driver for the given URL string. Specifying your driver's class here allows users to not have to use the driver
setting whenever they connect to your database.
Other Dialect Settings
There are a few dialect settings that do not have a default implementation and therefore must be defined:
- getDefaultPort() Default port used to connect to the database
- supportsInitiallyDeferrableColumns() Does your database support initially deferrable constraints?
- supportsTablespaces() Does your database support tablespaces?
For other functions where your database differs from assumptions the base class makes, override the corresponding methods.
API Details
The complete javadocs for liquibase.database.Database
is available at https://javadocs.liquibase.com
Extension Guides
The following guides provide relevant examples: