如何在没有DATABASECHANGELOG插入的情况下从Liquibase生成sql文件?

时间:2015-05-31 12:42:33

标签: ant liquibase

我有以下问题:我需要为生产中的数据库生成迁移文件。目前我正在使用ant并执行ant任务:

<liquibase:updateDatabase changeLogFile=db.changelog-master.xml" databaseRef="oracle-database"  outputFile="out_ora.sql"  />

但我的文件包含DATABASECHANGELOG表的插入语句。如何在没有此语句的情况下生成输出文件? (我不想手动或稍后通过某些脚本删除此语句)。

2 个答案:

答案 0 :(得分:0)

您可以使用此扩展程序:https://github.com/liquibase/liquibase-nochangelogupdate

只需将jar添加到类路径中,liquibase就不会输出任何databasechangelog SQL

答案 1 :(得分:0)

如果您想从ChangeSets过滤插入/更新,而不管Liquibase插入/更新语句只保留Create,Alter脚本。

使用要排除的类列表定义属性

 sqlgenerator.exclude=liquibase.statement.core.InsertOrUpdateStatement,liquibase.statement.core.InsertStatement,liquibase.statement.core.UpdateStatement,liquibase.statement.core.GetNextChangeSetSequenceValueStatement,liquibase.statement.core.MarkChangeSetRanStatement,liquibase.statement.core.RemoveChangeSetRanStatusStatement,liquibase.statement.core.UpdateChangeSetChecksumStatement

实现一个SQL Generator类,它过滤掉上面列出的类类别中的所有SQL语句。

Spring将属性注入到类中。一定要在“liquibase.sqlgenerator.ext”包下创建类。

@Component
public class FilteredSQLGenerator extends AbstractSqlGenerator<AbstractSqlStatement> {

  private static final Logger LOGGER = Logger.getLogger(FilteredSQLGenerator.class);

  private static String[] excludeArr = new String[0];

  @Value("${sqlgenerator.exclude}")
  private String exclude;

  @PostConstruct
  public void init() {

    LOGGER.debug(" Exclude List set to : " + exclude);
    if (StringUtils.isNotBlank(exclude)) {
      excludeArr = StringUtils.split(exclude, ',');
    }

  }


  @Override
  public ValidationErrors validate(AbstractSqlStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
    return sqlGeneratorChain.validate(statement, database);
  }


  @Override
  public int getPriority() {
    return 1000;
  }

  @Override
  public Sql[] generateSql(AbstractSqlStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {

    String clazzName = statement.getClass().getName();

    for (String exclude : excludeArr) {
      if (exclude.equals(clazzName)) {
        return new Sql[0];
      }
    }

    return sqlGeneratorChain.generateSql(statement, database);
  }
}