我正在寻找一种方法来记录并将所有这些SQL语句写入输出 在针对空运行Liquibase迁移时执行的文件 目标数据库。
这背后的想法是加快集成测试的初始化阶段 通过简单地从中读取和执行SQL语句来对测试数据库 生成的文件用于后续测试。
由于对变更集的处理方式不同,我没有运气使用updateSQL 前置条件(例如,对于“更新”,changeSetExecuted解析为true,但是为false “即updateSQL”)。
另一种方法是首先运行Liquibase迁移,然后编写临时迁移 使用GenerateChangeLogCommand更改日志文件,最终由另一个Liquibase使用 实例以生成SQL更新文件。
虽然这种方法有效,但a)感觉有点hacky-ish,b)最终结果不一样 直接运行迁移。
无论如何,我提出的是JdbcExecutor的自定义实现,它包含了 一个LoggingExecutor。实现如下:
@LiquibaseService(skip = true)
public class LoggingJdbcExecutor extends JdbcExecutor {
private LoggingExecutor loggingExecutor;
public LoggingJdbcExecutor(Database database, Writer writer) {
loggingExecutor = new LoggingExecutor(this, writer, database);
setDatabase(database);
}
@Override
public void execute(SqlStatement sql, List<SqlVisitor> sqlVisitors) throws DatabaseException {
super.execute(sql, sqlVisitors);
loggingExecutor.execute(sql, sqlVisitors);
}
@Override
public int update(SqlStatement sql, List<SqlVisitor> sqlVisitors) throws DatabaseException {
final int result = super.update(sql, sqlVisitors);
loggingExecutor.update(sql, sqlVisitors);
return result;
}
@Override
public void comment(String message) throws DatabaseException {
super.comment(message);
loggingExecutor.comment(message);
}
}
在调用update()之前,将此执行程序注入Liquibase,如下所示:
final String path = configuration.getUpdateSqlExportFile();
ExecutorService.getInstance().setExecutor(liquibase.getDatabase(), new LoggingJdbcExecutor(
liquibase.getDatabase(), new FileWriter(path)
));
这种方法是否合理且未来证明?虽然它似乎工作,但我不确定我是否可能 缺少一些东西,这是一种更好的方式。
由于