结合JdbcExecutor和LoggingExecutor

时间:2015-11-04 16:19:54

标签: liquibase

我正在寻找一种方法来记录并将所有这些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)
));

这种方法是否合理且未来证明?虽然它似乎工作,但我不确定我是否可能 缺少一些东西,这是一种更好的方式。

由于

0 个答案:

没有答案