#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();
}
Я пытался
- получение экземпляра класса liquibase во время выполнения с помощью class.getInstance()
- Получение местоположения списка изменений во время выполнения с помощью 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 выполняется только до первого.