我有以下问题:我需要为生产中的数据库生成迁移文件。目前我正在使用ant并执行ant任务:
<liquibase:updateDatabase changeLogFile=db.changelog-master.xml" databaseRef="oracle-database" outputFile="out_ora.sql" />
但我的文件包含DATABASECHANGELOG表的插入语句。如何在没有此语句的情况下生成输出文件? (我不想手动或稍后通过某些脚本删除此语句)。
答案 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);
}
}