首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有DATABASECHANGELOG插入的情况下从Liquibase生成sql文件?

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

Stack Overflow用户
提问于 2015-05-31 20:42:33
回答 2查看 2.3K关注 0票数 0

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

代码语言:javascript
复制
<liquibase:updateDatabase changeLogFile=db.changelog-master.xml" databaseRef="oracle-database"  outputFile="out_ora.sql"  />

但是我的文件包含了DATABASECHANGELOG表的insert语句。如果没有这个语句,我如何产生输出文件?(我不想手动或稍后通过脚本删除此语句)。

EN

回答 2

Stack Overflow用户

发布于 2015-06-24 05:50:50

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

只需将jar添加到您的类路径中,liquibase将不会输出任何数据库classpath

票数 0
EN

Stack Overflow用户

发布于 2016-02-27 01:22:12

如果要过滤insert/update from ChangeSets,而不考虑只保留Create、Alter脚本的Liquibase Insert/update语句。

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

代码语言:javascript
复制
 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“包下创建类。

代码语言:javascript
复制
@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);
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30557559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档