2016-03-08 90 views
3

在Spring Boot應用程序中,我試圖在運行集成測試之前初始化一些MySQL數據庫表和存儲過程,方法是在documentation中建議將schema.sql文件放在資源目錄中。Spring存儲過程引發MySQL數據庫初始化錯誤

create table語句可以工作,但create procedure語句會引發異常。導致異常的樣本schema.sql文件文件中的語句如下所示:

DROP PROCEDURE IF EXISTS `database`.FOO; 
CREATE PROCEDURE `database`.FOO() 

BEGIN 
    SELECT * from `database`.employees; 
END; 

的問題是,在存儲過程中的;字符被彈簧ScriptUtils類前解析schema.sql文件的文件解析出執行它,然後導致MySQL在腳本上發出語法錯誤。

我已經看了ScriptUtils類,一直沒有找到一種方法來逃避;字符與程序。使用\\\作爲轉義字符也不起作用,以及MySQL DELIMITER命令。

有沒有人能夠使用Spring Boot的schema.sql文件創建MySQL存儲過程?如果是的話,他們可以舉個例子嗎?

有關其他信息,以下Spring JIRA issue地址相同的主題,但被關閉了不會修復標籤。

+0

我沒有太多的信息,但可能會嘗試'^'作爲轉義字符。 –

回答

2

答案結果非常簡單。春季啓動具有可在application.properties文件中設置一個DataSource屬性分隔符:

spring.datasource.separator=^; 

然後在schema.sql文件文件中的所有語句;不是在存儲過程中需要與新品隔離進行更新。

DROP PROCEDURE IF EXISTS `database`.FOO; 
CREATE PROCEDURE `database`.FOO() 

BEGIN 
    SELECT * from `database`.employees; 
END ^; 
0

添加到@Andrews答案:

在使用自定義dataSource未自動由Spring啓動創建的,可能發生的是不使用spring.datasource.separator屬性。在這種情況下,分隔符不會被轉發到Populator。然後它可以直接在數據源初始化中設置。例如,下面就可以在一個特殊的更新配置文件假設dataSource被用來定義在別處:

<jdbc:initialize-database data-source="dataSource" enabled="${initDatabase:false}" separator="^;"> 
    <jdbc:script location="${update.schema.script}" /> 
</jdbc:initialize-database> 

或者,當在填充器中明確指出:

<bean id="dbPopulator" class="org.springframework.jdbc.datasource.init.ResourceDatabasePopulator"> 
    <property name="separator" value="^;"/> 
    <property name="scripts"> 
     <list> 
      <value>${update.schema.script}</value> 
     </list> 
    </property> 
</bean> 
<bean id="initDatabase" class="org.springframework.jdbc.datasource.init.DataSourceInitializer"> 
    <property name="dataSource"> 
     <ref bean="dataSource"/> 
    </property> 
    <property name="databasePopulator"> 
     <ref bean="dbPopulator"/> 
    </property> 
    <!-- The same can be done for the cleaner: --> 
    <!-- <property name="databaseCleaner"><ref bean="dbCleanup"/></property> --> 
</bean>