【问题标题】:Liquibase, how to set default schema programmatically in JavaLiquibase,如何在 Java 中以编程方式设置默认模式
【发布时间】:2015-12-21 21:43:21
【问题描述】:

我正在尝试在我的应用程序代码中运行 Liquibase。问题是在公共模式中创建了新表 ale,我如何将 liquibase 指向我的 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) {

            }
        }
    }

【问题讨论】:

  • 错误代码。捕获块永远不应为空。您应该在 catch 块中回滚并记录它。你从不承诺。您总是在 finally 块中回滚,因此您的任何更改都不会保留。
  • 很酷,谢谢,但这只是概念证明。我更感兴趣的是回答我原来的问题,而不是关心休息......
  • “您的任何更改都不会坚持” - 这是相关的。

标签: java postgresql liquibase


【解决方案1】:

您可以使用schemaName 属性在变更集中指定架构。所以你不需要以编程方式编写它。

Here 您可以查看官方文档,了解您可以执行的每个重构/变更集。花点时间看看如何指定每个重构的目标架构。

例如,添加列变更集:

<changeSet author="liquibase-docs" id="addColumn-example">
  <addColumn catalogName="cat"
        schemaName="public"
        tableName="person">
    <column name="address" type="varchar(255)"/>
  </addColumn>
</changeSet>

【讨论】:

  • 这很简洁,但是当我需要设置 liquibaseSchemaName 属性时该怎么办? 编辑: 没关系,我找到了:database.setLiquibaseSchemaName("schema_name"); 做到了!
【解决方案2】:

这可以使用liqubase.database.Database::setDefaultSchema 方法来完成。例如:

        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("")

还值得注意的是,您可以使用 setLiquibaseSchemaName 来决定 liquibase 将使用哪个架构来用于其内部表 databasechangelogdatabasechangeloglock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2018-03-22
    • 2014-09-22
    相关资源
    最近更新 更多