2017-03-21 107 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(); 
     } 

我希望這會有所幫助。

相關問題