【问题标题】:How to generate sql file from Liquibase without DATABASECHANGELOG inserts?如何在没有 DATABASECHANGELOG 插入的情况下从 Liquibase 生成 sql 文件?
【发布时间】:2016-07-15 18:44:50
【问题描述】:

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

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

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

【问题讨论】:

  • 能否使用上下文过滤掉包含插入语句的变更集?见:liquibase.org/documentation/contexts.html
  • 但是我怎么能用它呢? DATABASECHANGELOG 表的插入语句是在每个变更集之后自动生成的,所以我无法控制用上下文参数标记它们
  • 啊,现在我明白了。您正在谈论 liquibase 在生成 SQL 文件时创建的 INSERT 语句。简短的回答是您不想过滤掉这些。它们是 liquibase 的一个非常重要的特性,使其能够正确跟踪已应用的变更集。如果您真的真的很想删除它们,请使用脚本将它们过滤掉。总之,我的建议是将它们留在里面。
  • 是的,我真的很想删除它们。正如我已经提到的,我创建迁移 sql 文件到放置在生产系统上的数据库。此数据库不包含 DATABASECHANGELOG 表,因为 Liquibase 已应用于现有数据库。

标签: ant liquibase


【解决方案1】:

你可以使用这个扩展:https://github.com/liquibase/liquibase-nochangelogupdate

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

【讨论】:

    【解决方案2】:

    如果您想从变更集中过滤插入/更新,而不考虑仅保留 Create、Alter 脚本的 Liquibase 插入/更新语句。

    定义一个包含要排除的类列表的属性

     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”下创建类。

    @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);
      }
    }
    

    【讨论】:

    • Kamal,是否可以通过 Maven 完成您上面提到的任务?
    • 我不确定您是否已经找到了解决方案。如果您可以扩展 liquibase maven 插件,您应该也可以使用 maven 生成它们
    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 2016-04-20
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多