Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ant 如何在不插入DATABASECHANGELOG的情况下从Liquibase生成sql文件?_Ant_Liquibase - Fatal编程技术网

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

Ant 如何在不插入DATABASECHANGELOG的情况下从Liquibase生成sql文件?,ant,liquibase,Ant,Liquibase,我有以下问题:我需要为生产中的数据库生成迁移文件。目前我正在使用ant并执行以下ant任务: <liquibase:updateDatabase changeLogFile=db.changelog-master.xml" databaseRef="oracle-database" outputFile="out_ora.sql" /> 您可以使用此扩展名: 只要将jar添加到类路径中,如果您想从变更集中过滤insert/update,而不考虑liquibase insert/

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

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

您可以使用此扩展名:


只要将jar添加到类路径中,如果您想从变更集中过滤insert/update,而不考虑liquibase insert/update语句只保留Create、Alter脚本,那么liquibase将不会输出任何databasechangelog SQL

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

 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生成器类,用于过滤上面列出的类类别中的所有SQL语句

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

@组件
公共类FilteredSQLGenerator扩展了AbstractSqlGenerator{
私有静态最终记录器Logger=Logger.getLogger(FilteredSQLGenerator.class);
私有静态字符串[]excludeArr=新字符串[0];
@值(“${sqlgenerator.exclude}”)
私有字符串排除;
@施工后
公共void init(){
调试(“排除列表设置为:”+排除);
if(StringUtils.isNotBlank(排除)){
excludeArr=StringUtils.split(排除“,”);
}
}
@凌驾
公共验证错误验证(AbstractSqlStatement语句、数据库数据库、SqlGeneratorChain SqlGeneratorChain){
返回sqlGeneratorChain.validate(语句、数据库);
}
@凌驾
public int getPriority(){
返回1000;
}
@凌驾
公共Sql[]生成Sql(AbstractSqlStatement语句、数据库数据库、SqlGeneratorChain SqlGeneratorChain){
字符串clazzName=语句.getClass().getName();
for(字符串排除:excludeArr){
if(排除.equals(clazzName)){
返回新的Sql[0];
}
}
返回sqlGeneratorChain.generateSql(语句,数据库);
}
}

您能否使用上下文过滤掉包含insert语句的变更集?看:但是我怎么能用它呢?DATABASECHANGELOG表的Insert语句是在每个变更集之后自动生成的,所以我无法控制用上下文参数hhh标记它们,现在我明白了。您所说的是liquibase在生成SQL文件时创建的INSERT语句。简而言之,你不想过滤掉这些。它们是liquibase的一个非常重要的特性,使它能够正确地跟踪已经应用的变更集。如果您真的想删除它们,请使用脚本将它们过滤掉。总之,我的建议是把它们留在里面。是的,我真的很想把它们拿走。正如我所提到的,我创建了迁移sql文件到数据库,该数据库放在生产系统上。此数据库不包含DATABASECHANGELOG表,因为Liquibase已应用于现有数据库。Kamal,是否可以通过Maven实现上述任务?我不确定您是否已经找到解决方案。如果您可以扩展liquibase maven插件,那么您也应该能够使用maven生成它们
@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);
  }
}