在Spring应用程序中,我试图在运行集成测试之前初始化一些MySQL数据库表和存储过程,方法是按照schema.sql目录中的建议在文档目录中放置一个文档文件。
create语句工作,但create语句抛出一个异常。导致异常的示例schema.sql文件语句如下所示:
DROP PROCEDURE IF EXISTS `database`.FOO;
CREATE PROCEDURE `database`.FOO()
BEGIN
SELECT * from `database`.employees;
END;问题是存储过程中的;字符正在由Spring ScriptUtils类解析,该类在执行schema.sql文件之前解析它,这将导致MySQL在脚本上抛出语法错误。
我看过ScriptUtils类,没有找到用这些过程来转义;字符的方法。使用\\和\作为转义字符,以及MySQL DELIMITER命令也不起作用。
是否有人能够使用带有Spring的MySQL文件创建schema.sql存储过程?如果是这样的话,他们能举一个例子吗?
关于一些其他信息,下面的春季JIRA问题解决了相同的主题,但最后使用了一个不会修复的标签。
发布于 2016-03-08 15:23:55
结果,答案非常简单。Spring有一个DataSource分隔符属性,可以在application.properties文件中设置该属性:
spring.datasource.separator=^;然后,在schema.sql文件中,所有不在存储过程中的;语句都需要使用新的分隔符进行更新。
DROP PROCEDURE IF EXISTS `database`.FOO;
CREATE PROCEDURE `database`.FOO()
BEGIN
SELECT * from `database`.employees;
END ^;发布于 2017-05-09 13:46:26
添加@Andrews回答:
当使用Spring未自动创建的自定义dataSource时,可能会发生不使用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>发布于 2020-08-21 10:02:59
如果有人像我一样在这个线程上使用spring+测试容器,就可以省略分隔符,从而导致测试容器的解析器是过程语法的觉知 (尽管仍然不适用于MS)。因此,原始脚本将起作用:
DROP PROCEDURE IF EXISTS `database`.FOO;
CREATE PROCEDURE `database`.FOO()
BEGIN
SELECT * from `database`.employees;
END;https://stackoverflow.com/questions/35856652
复制相似问题