Ant 如何在不插入DATABASECHANGELOG的情况下从Liquibase生成sql文件?
我有以下问题:我需要为生产中的数据库生成迁移文件。目前我正在使用ant并执行以下ant任务: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/
<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);
}
}