Back to Flyway

PostgreSQL Database

documentation/Reference/Database Driver Reference/PostgreSQL Database.md

latest5.5 KB
Original Source
  • Verified Versions: 9.2, 18
  • Maintainer: {% include redgate-badge.html %}

Supported Versions and Support Levels

{% include database-boilerplate.html %}

Driver

ItemDetails
URL format<code>jdbc:postgresql://<i>host</i>:<i>port</i>/<i>database</i></code>
SSL supportYes - add ?ssl=true
Ships with Flyway Command-lineYes
Maven Central coordinatesorg.postgresql:postgresql
Supported versions9.3-1104-jdbc4 and later
Default Java classorg.postgresql.Driver

PostgreSQL-specific configuration can be found here.

Java Usage

PostgreSQL support is a separate dependency for Flyway and will need to be added to your Java project to access these features. PostgreSQL is found within the flyway-database-postgresql plugin module.

Maven

Redgate

xml
<dependency>
    <groupId>com.redgate.flyway</groupId>
    <artifactId>flyway-database-postgresql</artifactId>
</dependency>

Open Source

xml
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-database-postgresql</artifactId>
</dependency>

Gradle

Redgate

groovy
buildscript {
    dependencies {
        implementation "com.redgate.flyway:flyway-database-postgresql"
    }
}

Open Source

groovy
buildscript {
    dependencies {
        implementation "org.flywaydb:flyway-database-postgresql"
    }
}

SQL Script Syntax

  • Standard SQL syntax with statement delimiter ;
  • Stored procedures (CREATE FUNCTION with $$ escapes, as generated by pg_dump)
  • COPY ... FROM STDIN (as generated by pg_dump)

Compatibility

  • DDL exported by pg_dump can be used unchanged in a Flyway migration.
  • Any PostgreSQL sql script executed by Flyway, can be executed by the PostgreSQL command-line tool and other PostgreSQL-compatible tools (after the placeholders have been replaced).

Example

<pre class="prettyprint">/* Single line comment */ CREATE TABLE test_data ( value VARCHAR(25) NOT NULL PRIMARY KEY ); /* Multi-line comment */ -- Multi-statement PostgreSQL function CREATE FUNCTION AddData() RETURNS INTEGER AS $$ BEGIN INSERT INTO test_data (value) VALUES ('Hello'); RETURN 1; END; $$ LANGUAGE plpgsql; SELECT * INTO TEMP adddata_temp_table FROM AddData() ; -- Single-statement PostgreSQL function CREATE FUNCTION add(integer, integer) RETURNS integer LANGUAGE sql IMMUTABLE STRICT AS $_$select $1 + $2;$_$; -- Placeholder INSERT INTO ${tableName} (name) VALUES ('Mr. T');</pre>

Authentication

Flyway supports the following PostgreSQL authentication methods:

  • URL authentication
  • SCRAM
  • pgpass

URL authentication

The user and password can be provided in the JDBC URL, in the form

jdbc:postgresql://<host>:<port>/<database>?user=myUsername&password=myPassword&<key1>=<value1>&<key2>=<value2>...

In this case, they do not need to be passed separately in configuration and the Flyway commandline will not prompt for them.

SCRAM

SCRAM authentication encryption is supported transparently using the current driver (42.2.14) - note that .jre6 and .jre7 versions of the driver for older JREs do not support it.

pgpass

{% include teams.html %}

Authentication can be done with a pgpass file to retrieve the password for a connection, in which case it does not need to be supplied in configuration. If the path to a pgpass file is set in the environment variable PGPASSFILE, it will be read from here. If not, then in Windows the file will be read from the location %APPDATA%\postgresql\pgpass.conf, otherwise it is read from~/.pgpass. You can read more about pgpass files and their structure here.

Lock Types

By default Flyway uses a transactional lock with PostgreSQL, however this can cause issues with certain SQL statements, most notably CREATE INDEX CONCURRENTLY. In this scenario, transactional locks can be replaced with session-level locks by setting flyway.postgresql.transactional.lock=false in your configuration.

Limitations

  • No support for PSQL meta-commands with no JDBC equivalent like \set
  • Clean does not remove objects created by extensions. It is therefore highly recommended to create your extensions using CREATE EXTENSION IF NOT EXISTS in order to be able to clean and (re-)migrate your schemas at will
  • No support for cleaning referenced large objects in pg_largeobject (Issue 1934)
  • No support for the passfile or hostaddr parameter when using pgpass as there is no JDBC equivalent

Feature support for check command

Support for the check command on PostgreSQL databases is currently ongoing. Basic support for the following object types has been implemented.

  • Aggregates
  • Domains
  • Enumerations
  • Foreign Keys
  • Functions
  • Indexes
  • Materialized Views
  • Procedures
  • Schemas
  • Sequences
  • Tables
  • Triggers
  • Views