2014-06-06 35 views
0

我有一個CustomTaskChange Liquibase(除了其他ChangeSets)。 我希望我的應用程序在實際執行之前顯示所有ChangeSet的SQL。在我的理解中,updateSQL應該預覽SQL並不執行任何操作。然而,CustomTaskChange立即執行。當我打電話給updateSQL時,我預料CustomTaskChange會被忽略。CustomTaskChange實際執行時被稱爲updateSQL

的變更:

<changeSet id="2" author="clu"> 
    <comment>Print out 'helloworld'.</comment> 
    <customChange class="path.to.HelloWorldUpdate"> 
</customChange> 
</changeSet> 

的CustomTaskChange:

public class HelloWorldUpdate implements CustomTaskChange { 
    @Override 
public void execute(Database database) throws CustomChangeException { 
    System.out.println("HELLO WORLD!!"); 
} 
} 

當調用updateSQL控制檯輸出 「Hello World!」

這是一個錯誤?有沒有解決方法?

謝謝!

[編輯]

回答

0

CustomTaskChange描述說:

Interface to implement when creating a custom change that does not actually 
generate SQL. If you are updating a database through SQL, 
implementing CustomSqlChange is preferred because the SQL can either 
be executed directly or saved to a text file for later use depending 
on the migration mode used. 

所以使用CustomSqlChange代替。

generateStatements()方法中,您還可以在返回SqlStatement[]數組之前打印出sql。 println每次都會運行。但是您創建的語句不會應用於數據庫,而只會在您選擇使用updateSQL運行時纔打印出來。

+0

感謝您的回答。也許我沒有說清楚...... 我實際上想要一個Java方法在'update'上運行,上面的類'HelloWorldUpdate'只是一個玩具的例子。實際的'CustomSqlChange'應該根據程序中的計算更新列。但它是數據庫重構的一部分。 – ludsen

+0

當調用updateSQL時,我希望LB能夠預覽CustomSqlChange的SQL,但對於CustomTaskChange什麼也不做。如果它只是預覽DB操作,爲什麼它會執行該任務? – ludsen

+0

'updateSQL'用於寫入liquibase將對文件而不是數據庫執行的更改。然後你可以預覽文件(作爲一個用例)並查看liquibase將執行的操作。 – Jens