数据库没有从Liquibase java API更新

时间:2015-11-24 13:41:34

标签: java liquibase

我正在使用Liquibase java API从databaseChangeLog文件更新我的数据库。代码正在运行,但更改未反映在数据库中。 代码如下:

public class testclass {
    public static void main(String[] args) {
        try{
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@a_valid_hostname:1521:db11gr2",
                    "[username]", "[password]");
            Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(conn));
            DatabaseChangeLog log = new DatabaseChangeLog("E:\\Delta.xml");
            Liquibase liquibase = new liquibase.Liquibase(log, new ClassLoaderResourceAccessor(), database);
            liquibase.update(new Contexts(), new LabelExpression());
            System.out.println("COMPLETED");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

我做错了吗?请帮帮我。

3 个答案:

答案 0 :(得分:4)

更仔细地查看您的代码,我怀疑您可能使用了错误类型的ResourceAccessor

文件"E:\\Delta.xml"实际上是否在您的类路径上?如果没有,请更改此行

Liquibase liquibase = new liquibase.Liquibase(log, new ClassLoaderResourceAccessor(), database);

Liquibase liquibase = new liquibase.Liquibase(log, new FileSystemResourceAccessor(), database);

这告诉liquibase从文件系统读取changelog文件,而不是类路径。

答案 1 :(得分:1)

由于OP没有发布他是如何设法让这个工作的,我在这里发布一个工作代码。请注意,我正在使用json ChangeLog和MySQL。

try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://*****/test",
                "****", "****");
        Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(conn));
        Liquibase liquibase = new Liquibase("test.json", new FileSystemResourceAccessor(), database);
        liquibase.update(new Contexts(), new LabelExpression());
    } catch(Exception e){
        // ...
    }

答案 2 :(得分:0)

使用String初始化Liquibase作为第一个参数而不是DatabaseChangeLog。示例如下:

    final Connection connection =  DriverManager.getConnection("jdbc:mysql://localhost/test?useSSL=false", "***", "***");

    final Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(
            new JdbcConnection(connection)
    );

    final Liquibase liquibase = new Liquibase("migrations.xml", new ClassLoaderResourceAccessor(), database);

    liquibase.update(new Contexts(), new LabelExpression());