I'm using Dropwizard (1.0.0) and Liquibase to create a database if it's not existing.
Problem here is that I'm using a different Postgres schema (not public). It seems like Liquibase is not able to create this schema before is it? I was expecting Liquibase to generate this schema, but it always throws a "Schema with name xx not found" if I try to build the database.
In Liquibase there is no "create schema" tag, because it is designed to manage objects within the application's schema. However, we can use a custom SQL statement inside a 'sql' tag to make a creation of a schema a part of our migration.
To use Liquibase and PostgreSQL, you need the JDBC driver JAR file (Maven download). The latest version of Liquibase has a pre-installed driver for this database in the liquibase/internal/lib directory.
Even though Liquibase does not have CREATE SCHEMA
in its bundled changes/refactorings (and therefore doesn't generate one during a dropwizard db dump
), you could still include this as a changeset in your migrations changelog using the sql
tag, as follows:
<changeSet author="christian" id="1">
<sql dbms="postgresql" endDelimiter=";">
CREATE SCHEMA foo
</sql>
</changeSet>
Note that Liquibase will create it's own tables in the PUBLIC
schema, regardless - before applying any changesets:
If you run db migrate --dry-run
in dropwizard, you'll see that Liquibase would first execute
CREATE TABLE PUBLIC.DATABASECHANGELOGLOCK ...
CREATE TABLE PUBLIC.DATABASECHANGELOG ...
before running
CREATE SCHEMA foo;
Not directly in answer to the question, but posting it for anyone who ran into the error I did, with creating tables in multiple schemas. I was getting an error executing this from maven with the defaultSchemaName
configuration.
[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.6.2:update (default-cli) on project demo: Error setting up or running Liquibase: ERROR: relation "databasechangelog" already exists [Failed SQL: CREATE TABLE databasechangelog (ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED TIMESTAMP WITHOUT TIME ZONE NOT NULL, ORDEREXECUTED INTEGER NOT NULL, EXECTYPE VARCHAR(10) NOT NULL, MD5SUM VARCHAR(35), DESCRIPTION VARCHAR(255), COMMENTS VARCHAR(255), TAG VARCHAR(255), LIQUIBASE VARCHAR(20), CONTEXTS VARCHAR(255), LABELS VARCHAR(255), DEPLOYMENT_ID VARCHAR(10))] -> [Help 1]
I tried to fix it by adding the following configurations to pom.xml, but that was only a partial solution:
<defaultSchemaName>foo</defaultSchemaName>
<changelogSchemaName>foo</changelogSchemaName>
Finally, I got this fixed by adding foo to the end of my connection string also, like this
jdbc:postgresql://localhost:5432/postgres?currentSchema=foo
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With