java - 使用变更日志 xml 作为流输入运行 liquibase

标签 java dynamic liquibase changelog

我需要创建 liquibase 变更日志,其中包含运行时所需的所有变更集,并使用动态创建的变更日志流运行 liquibase。

我知道我们可以拥有静态变更日志 xml 文件并将它们提供给运行 liquibase。

我想知道是否有一种方法可以加载这个动态变更日志 xml 并运行 liquibase?

最佳答案

我有同样的要求,我创建了一个新的资源访问器来加载 json 字符串(与 xml 相同)

public class Main {

private class StreamResourceAccessor extends AbstractResourceAccessor {
    private String json;
    public StreamResourceAccessor(String jsonString) {
        super();
        this.json = jsonString;
    }

    @Override
    public Set<InputStream> getResourcesAsStream(String name) throws IOException {
        InputStream stream = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));

        Set<InputStream> returnSet = new HashSet<>();
        returnSet.add(stream);
        return returnSet;
    }

    @Override
    public Set<String> list(String arg0, String arg1, boolean arg2, boolean arg3, boolean arg4) throws IOException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ClassLoader toClassLoader() {
        // TODO Auto-generated method stub
        return null;
    }

}

public static void main(String[] args) throws SQLException, LiquibaseException {
    String url = "jdbc:postgresql://localhost/postgres";
    Properties props = new Properties();
    props.setProperty("user","postgres");
    props.setProperty("password","");
    //props.setProperty("ssl","true");
    Connection connection = DriverManager.getConnection(url, props);

    Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
    String jsonText = "{\"databaseChangeLog\":[{\"preConditions\":[{\"runningAs\":{\"username\":\"postgres\"}}]},{\"changeSet\":{\"id\":\"1\",\"author\":\"nvoxland\",\"changes\":[{\"createTable\":{\"tableName\":\"person\",\"columns\":[{\"column\":{\"name\":\"id\",\"type\":\"int\",\"autoIncrement\":true,\"constraints\":{\"primaryKey\":true,\"nullable\":false},}},{\"column\":{\"name\":\"firstname\",\"type\":\"varchar(50)\"}},{\"column\":{\"name\":\"lastname\",\"type\":\"varchar(50)\",\"constraints\":{\"nullable\":false},}},{\"column\":{\"name\":\"state\",\"type\":\"char(2)\"}}]}}]}},{\"changeSet\":{\"id\":\"2\",\"author\":\"nvoxland\",\"changes\":[{\"addColumn\":{\"tableName\":\"person\",\"columns\":[{\"column\":{\"name\":\"username\",\"type\":\"varchar(8)\"}}]}}]}},{\"changeSet\":{\"id\":\"3\",\"author\":\"nvoxland\",\"changes\":[{\"addLookupTable\":{\"tableName\":\"person\",\"existingTableName\":\"person\",\"existingColumnName\":\"state\",\"newTableName\":\"state\",\"newColumnName\":\"id\",\"newColumnDataType\":\"char(2)\",}}]}}]}";

    Main main = new Main();
    ResourceAccessor resourceAccessor = main.new StreamResourceAccessor(jsonText);

    Liquibase liquibase = new Liquibase("hello.json", resourceAccessor, database);
    try {
        Contexts context = new Contexts();
        liquibase.update(context);
    } catch (Exception e) {
        System.out.println(e);
    }
}

}

关于java - 使用变更日志 xml 作为流输入运行 liquibase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36051992/

相关文章:

java - 无法导入 com.google.api.client.json.jackson.JacksonFactory

java - 如何注意到客户端与服务器断开连接 - JAVA

vba - 动态改变编号VBA 数组的维数

db2 - 如何在 Liquibase 中生成 GRANT?

java - 替换缺失的 liquibase 类,从 liquibase 2.0.3 迁移到 3.3.0

java - 使用键盘移动图像 - Java

java - 嵌套循环的实现

javascript - Angular Directive(指令) - 动态 Controller

javascript - 即使 DOM 显示innerHTML,Textarea 也不会在 UI 中显示内容

mysql - Liquibase Diff 操作不生成输出文件