2017-03-21 90 views
2

我以编程方式对DatabaseChangeLog对象进行了更改。 我怎么能基于java的DatabaseChangeLog生成diffChangeLogFile文件。如何以编程方式从DatabaseChangeLog生成xml文件

编辑: 这里是一个例子

public DatabaseChangeLog removeDropColumnChangeFromDatabaseChangeLog(
      DatabaseChangeLog databaseChangeLog, String oldName, 
      String newName, String tableName) { 

     DatabaseChangeLog changeLog = databaseChangeLog; 
     Collection<ChangeSet> changeSetsToRemove = new ArrayList<ChangeSet>(); 

     List<ChangeSet> changeSets = changeLog.getChangeSets(); 

     // Remove DropColumnChange from ChangeSets using tableName, oldName and 
     // newName 
     for (ChangeSet cs : changeSets) { 
      for (Change change : cs.getChanges()) { 
       if (change instanceof DropColumnChange) { 
        DropColumnChange aux2 = (DropColumnChange) change; 
        if (aux2.getTableName().equals(tableName)) { 
         if (aux2.getColumnName().equals(oldName)) { 
          changeSetsToRemove.add(cs); 
         } 
        } 
       } 
      } 
     } 
     changeSets.removeAll(changeSetsToRemove); 
     DatabaseChangeLog databaseChangeLogWithoutAddColumn = new DatabaseChangeLog(); 
     for (ChangeSet cs : changeSets) { 
      databaseChangeLogWithoutAddColumn.addChangeSet(cs); 
     } 
     return databaseChangeLogWithoutAddColumn; 
    } 

这种方法将有一个DatabaseChangeLog对象作为输入,它会删除从它的dropColumn改变时,表名是等于表名的参数。

在对DatabaseChangeLog对象进行此修改后,我想生成一个xml文件,其中包含相对于DatabaseChangeLog对象(为了进行更新而在liquibase生成diff后生成的xml)的变更集。

像这样:

databaseChange.generateXmlFile(pathToFile);

+0

你能解释一下什么“...程序上改变了DatabaseChangeLog对象...”的含义?我不明白你做了什么。 – Jens

+0

@Jens我上面加了一个例子 – larnouch

+0

也许你可以使用主[Liquibase](http://www.liquibase.org/javadoc/liquibase/Liquibase.html)类并调用它的一个方法来完成这个任务。我没有直接从Java中调用liquibase,也没有编写任何liquibase插件。所以也许这是因为我缺乏这方面的知识,但是你如何运行代码(或者你如何运行liquibase?) – Jens

回答

3

Finnaly我发现成liquibase源代码是如何变更的列表转换为XML文件输出。(我们可以检索chnageSets的从databaseChangeLog列表)

/** 
    * Prints changeLog that would bring the target database to be the same as 
    * the reference database 
    */ 
    public void print(PrintStream out, ChangeLogSerializer changeLogSerializer) throws ParserConfigurationException, IOException, DatabaseException { 

     List<ChangeSet> changeSets = generateChangeSets(); 

     changeLogSerializer.write(changeSets, out); 

     out.flush(); 
    } 

这里是我所产生的一个例子xml文件输出后,进行更改为databaseChangeLog对象

 // TESTING CHANGELOG GENERATION 
     PrintStream printStreamFile =null; 
     try { 
      printStreamFile = new PrintStream("pathTofile/changeLogAfterChange.xml"); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     XMLChangeLogSerializer changeLogSerializer = new XMLChangeLogSerializer(); 

     try { 
      changeLogSerializer.write(databaseChangeLog.getChangeSets(), printStreamFile); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

我希望这会有所帮助。

相关问题