2015-10-15 97 views
1

我正在嘗試爲單元測試創​​建一個MariaDB數據庫,並希望使用Spring的ScriptUtils來執行包含表和testdata轉儲的SQL文件。當我創建使用HeidiSQL轉儲它插入註釋生成的SQL文件,如下所示禁用外鍵檢查,同時在裝載包含代碼:Spring的ScriptUtils忽略包含轉儲註釋的代碼

/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 

當我通過HeidiSQL一切正常執行dump腳本很好。在拋出,因爲外鍵約束失敗例外

@BeforeClass 
public static void initializeForTest() throws Exception { 
    context = new ClassPathXmlApplicationContext("Beans.xml"); 
    dsRoot = (DataSource) context.getBean("dataSourceRoot"); 
    ScriptUtils.executeSqlScript(dsRoot.getConnection(), new ClassPathResource("DROP_AND_CREATE_DATABASE.sql"));    
} 

結果,因爲轉儲創建了哪個仍然要創建表的外鍵引用一些表:在Java中使用下面的函數,雖然。例如:

CREATE TABLE `cities` (
    `postal_code` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
    `country_alpha2` varchar(2) COLLATE utf8_unicode_ci NOT NULL, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`postal_code`,`country_alpha2`), 
    KEY `country_alpha2` (`country_alpha2`), 
    CONSTRAINT `cities_ibfk_1` FOREIGN KEY (`country_alpha2`) REFERENCES `countries` (`alpha2`) 
); 

/* ... */ 

CREATE TABLE `countries` (
    `code` int(3) NOT NULL, 
    `alpha2` varchar(2) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `alpha3` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `langCS` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `langDE` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `langEN` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `langES` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `langFR` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `langIT` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `langNL` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (`code`), 
    UNIQUE KEY `alpha2` (`alpha2`), 
    UNIQUE KEY `alpha3` (`alpha3`) 
); 

我能以某種方式執行腳本而不忽略含代碼的註釋嗎?

回答

0

ScriptUtils JavaDoc中最有用的javadoc是

splitSqlScript(
     EncodedResource resource, 
     String script, 
     String separator, 
     String commentPrefix, 
     String blockCommentStartDelimiter, 
     String blockCommentEndDelimiter, 
     List<String> statements)` method, because it explains the meaning of the parameters: 

拆分SQL腳本到由提供 分隔字符串分隔獨立的語句之一。每個單獨的陳述將被添加到提供的{@code List}提供的 。

在該腳本中,所提供的代碼將被兌現: 任何以註釋前綴開始並延伸到 末尾的文本都將從輸出中省略。

類似地,提供 {@code blockCommentStartDelimiter}和{@code blockCommentEndDelimiter}定界符將生效:封閉在塊註釋的任何文本 將從輸出被省略。

此外,多個相鄰的空白字符將摺疊爲 到一個空間。 ...

因此,一個二看UTIL之後,你會發現方法:

public static void executeSqlScript(
     Connection connection, 
     EncodedResource resource, 
     boolean continueOnError, 
     boolean ignoreFailedDrops, 
     String commentPrefix, 
     String separator, 
     String blockCommentStartDelimiter, 
     String blockCommentEndDelimiter) 

它接縫,你無法禁用塊註釋刪除的Funktion,但你可以配置者它使用其他塊註釋分隔符: 所以我認爲訣竅是使用不同的或根本不會發生的blockCommentStartDelimiter

ScriptUtils.executeSqlScript(
    dsRoot.getConnection(), //Connection connection, 
    new EncodedResource(new ClassPathResource("DROP_AND_CREATE_DATABASE.sql")), //EncodedResource resource, 
    false,  //boolean continueOnError, 
    false,  //boolean ignoreFailedDrops, 
    "--",  //String commentPrefix, 
    ";",  //String separator, 
    "##/*",  //String blockCommentStartDelimiter, 
    "*/##"); //String blockCommentEndDelimiter) 

BTW:其他解決辦法:不要通過查找改變所有的意見和替換:添加set foreign_key_checks = 0;在開始和set foreign_key_checks = 1;底。

0

我們最近遇到了一個類似的問題,那就是在ScriptUtils正在執行的SQL查詢中使用Oracle提示。

使用上面建議的「假」分隔符解決了它,但它似乎是一個問題,應該在ScriptUtils本身中解決。

我在https://jira.spring.io/browse/DATAJDBC-88

由於打開了這個JIRA票。