I am trying to run Liquibase in my appliction code. The problem is that new table ale created in public schema, how can I point liquibase to different schema in my Postgres.
Liquibase liquibase = null;
Connection connection = null;
try {
connection = DB.getConnection();
liquibase = new Liquibase(CHANGELOG_FILE, new FileSystemResourceAccessor(), new JdbcConnection(connection));
//change default schema here
liquibase.update(STAGE);
} catch (LiquibaseException e) {
} finally {
if (connection != null) {
try {
connection.rollback();
connection.close();
} catch (SQLException e) {
}
}
}
You can specify the schema in the changeset using schemaName attribute. So you don't need to write it programaticaly.
Here you can review official documentation for every refactor/changeset you can do. Take a while and see how you can specify what schema is the target for every refactor.
For example, add column changeset:
<changeSet author="liquibase-docs" id="addColumn-example">
<addColumn catalogName="cat"
schemaName="public"
tableName="person">
<column name="address" type="varchar(255)"/>
</addColumn>
</changeSet>
This can be done using the liqubase.database.Database::setDefaultSchema method. For example:
val dbUrl = "jdbc:h2:~/aviary-db/dev;MODE=MySQL;DATABASE_TO_UPPER=false;IGNORECASE=TRUE;INIT=create schema if not exists aviary;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=2"
Connection conn = DriverManager.getConnection(dbUrl, user, password)
val dbConnection = JdbcConnection(conn)
val database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(dbConnection)
database.defaultSchemaName = "schema_name"
val liquibase = Liquibase("db/db-changelog.xml", ClassLoaderResourceAccessor(), database)
liquibase.update("")
It's also worth noting that you can use setLiquibaseSchemaName to decide which schema liquibase will use for it's internal tables databasechangelog and databasechangeloglock.
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