2011-12-15 92 views
30

我在演示服務器中設置了我的應用程序的新版本,並且很想找到每天重置數據庫的方法。我想我總是可以執行cron作業,執行刪除操作並創建查詢,但我正在尋找更乾淨的方法。我嘗試使用特殊的持久性單元,使用drop-create方法,但由於系統經常(按需)連接和斷開服務器,因此它不起作用。定期重置嵌入式H2數據庫

有沒有更好的方法?

回答

55

H2支持一種特殊的SQL語句drop all objects

DROP ALL OBJECTS [DELETE FILES] 

如果你不想刪除所有的表,你可能需要使用truncate table

+0

感謝。我的工作 – javydreamercsw 2011-12-16 18:36:00

+1

TRUNCATE TABLE不會將AUTO_INCREMENT計數器重置爲零:( – Nazar 2014-02-14 11:44:01

1

命令:SHUTDOWN
你可以使用RunScript.execute(jdbc_url,user,password,「classpath:shutdown.sql」,「UTF8」,false)來執行它。
我當測試套件使用@AfterClass

12

由於這種反應是首款谷歌結果爲「復位H2數據庫」,我下面張貼我的解決方案完成每一次運行它:

後每JUnit的@tests

  • 禁用完整性約束
  • 列表中(默認)所有表PUBLIC方案
  • 截斷所有表
  • 列表中(默認的)的所有序列PUBLIC模式
  • 復位所有序列
  • 重新啓用的約束。

    @After 
    public void tearDown() { 
        try { 
         clearDatabase(); 
        } catch (Exception e) { 
         Fail.fail(e.getMessage()); 
        } 
    } 
    
    public void clearDatabase() throws SQLException { 
        Connection c = datasource.getConnection(); 
        Statement s = c.createStatement(); 
    
        // Disable FK 
        s.execute("SET REFERENTIAL_INTEGRITY FALSE"); 
    
        // Find all tables and truncate them 
        Set<String> tables = new HashSet<String>(); 
        ResultSet rs = s.executeQuery("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='PUBLIC'"); 
        while (rs.next()) { 
         tables.add(rs.getString(1)); 
        } 
        rs.close(); 
        for (String table : tables) { 
         s.executeUpdate("TRUNCATE TABLE " + table); 
        } 
    
        // Idem for sequences 
        Set<String> sequences = new HashSet<String>(); 
        rs = s.executeQuery("SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA='PUBLIC'"); 
        while (rs.next()) { 
         sequences.add(rs.getString(1)); 
        } 
        rs.close(); 
        for (String seq : sequences) { 
         s.executeUpdate("ALTER SEQUENCE " + seq + " RESTART WITH 1"); 
        } 
    
        // Enable FK 
        s.execute("SET REFERENTIAL_INTEGRITY TRUE"); 
        s.close(); 
    } 
    

另一解決辦法是在每個試驗的開始時到recreatethe數據庫。但是,如果是大數據庫,那可能太長了。

1

THRE是數據庫操作在Spring的特殊語法內進行單元測試

@Sql(scripts = "classpath:drop_all.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) 
@Sql(scripts = {"classpath:create.sql", "classpath:init.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) 
public class UnitTest {} 

在這個例子中,我們每個測試方法之後執行drop_all.sql腳本(我們dropp所需的所有表)。 在這個例子中,我們執行create.sql腳本(這是我們創建所有需要的表),並init.sql腳本(這裏我們初始化所有需要的表之前,每個測試方法。

相關問題