Отредактируйте список изменений Liquibase, чтобы включить новые файлы наборов изменений во время выполнения

#java #liquibase

Вопрос:

У меня есть код, который редактирует список изменений.json во время выполнения. Однако, когда я запускаю liquibase.migrate (), он не учитывает последние изменения.

Файл журнала изменений перед выполнением

 {
  "databaseChangeLog" : [ ]
}
 

Файл журнала изменений во время выполнения перед выполнением liquibase.update()

 {
  "databaseChangeLog" : [ {
    "include" : {
      "file" : "changesets/myFolder/changeset-0.sql"
    }
  } ]
}
 

Метод, используемый для добавления новых файлов набора изменений в журнал изменений во время выполнения

     public void addNewChangeSetToChangeLog(File file) throws IOException {
        FileReader fileReader= new FileReader("src/changesets/DbChangelog.json");
        BufferedReader br= new BufferedReader(fileReader);
        StringBuilder jsonString =new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            jsonString.append(line);
            jsonString.append("n");
        }

        JsonNode jsonNode=objectMapper.readTree(String.valueOf(jsonString));
        ArrayNode arrayNode= (ArrayNode) jsonNode.get("databaseChangeLog");

        JsonNode newChangeSetNode=objectMapper.readTree("{"include":{"file":"" file.getPath() ""}}");
        arrayNode.add(newChangeSetNode);

        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
        ObjectWriter writer = objectMapper.writer();
        writer.writeValue(new File("src/changesets/DbChangelog.json"), jsonNode);

        br.close();
        fileReader.close();
    }
 

Я пытался

  1. получение экземпляра класса liquibase во время выполнения с помощью class.getInstance()
  2. Получение местоположения списка изменений во время выполнения с помощью userinput, чтобы оно было неизвестно во время компиляции Ниже приведен метод, используемый для вызова обновления liquibase
 public void execute(Connection connection) throws LiquibaseException, IOException {
        Database database = DatabaseFactory.
                getInstance().
                findCorrectDatabaseImplementation(new JdbcConnection(connection));

        LiquibaseUtils liquibaseUtils=new LiquibaseUtils();

        liquibase.Liquibase liquibase = new liquibase.Liquibase("changesets/DbChangelog.json", new ClassLoaderResourceAccessor(), database);

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

    }
 

Ответ №1:

если у вас есть отредактированный запрос на изменение таблицы или добавление/обновление данных, вы должны объявить его в new , поэтому, когда liquibase запросит databasechangelog в вашей базе данных и обнаружит новый набор изменений, liquibase выполнит его.

в вашем случае добавьте новый файл, включающий набор изменений-1.sql с новым запросом.

Комментарии:

1. Я не редактирую ни один существующий файл набора изменений. Я пытаюсь создать новый файл набора изменений для любого запроса alter/add/update, а затем добавить этот файл в качестве последней записи в DbChangeLog.json. Моя точная проблема заключается в том, что он не распознает изменения в DbChangeLog.json во время выполнения

2. Итак, давайте скажем после запуска:1 у меня есть 1 запись в моем DbChangeLog. Liquibase не выполняет никаких операций. После второго запуска у меня есть 2 записи в моем DbChangeLog, но liquibase выполняется только до первого.