Java 弹簧&x27;s ScriptUtils忽略转储中包含注释的代码
我正在尝试为单元测试创建一个MariaDB数据库,并希望使用Spring的Java 弹簧&x27;s ScriptUtils忽略转储中包含注释的代码,java,mysql,spring,mariadb,spring-jdbc,Java,Mysql,Spring,Mariadb,Spring Jdbc,我正在尝试为单元测试创建一个MariaDB数据库,并希望使用Spring的ScriptUtils执行包含表和测试数据转储的SQL文件。当我使用HeidiSQL创建转储时,它会将包含注释的代码插入到生成的sql文件中,如下所示,以在加载转储时禁用外键检查: /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 当我通过HeidiSQL执行转储脚本时,一切都很顺利。但在Java中使用以
ScriptUtils
执行包含表和测试数据转储的SQL文件。当我使用HeidiSQL创建转储时,它会将包含注释的代码插入到生成的sql文件中,如下所示,以在加载转储时禁用外键检查:
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
当我通过HeidiSQL执行转储脚本时,一切都很顺利。但在Java中使用以下函数:
@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"));
}
由于外键约束失败,导致引发异常,因为转储创建了一些表,其中包含对仍需创建的表的外键引用。例如:
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`)
);
我可以在不忽略包含注释的代码的情况下执行脚本吗?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:
提示您不能禁用块注释删除功能,但可以将其配置为使用其他块注释分隔符:
因此,我认为诀窍是使用一个不同或根本不发生的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)
顺便说一句:其他解决方法:改为通过查找和替换更改所有注释:添加
set foreign\u key\u checks=0开始时编码>并设置外键检查=1代码>结尾。最近,当我们在由ScriptUtils执行的SQL查询中使用Oracle提示时,我们遇到了类似的问题
如上所述,使用“伪”分隔符解决了这个问题,但这似乎是一个应该在ScriptUtils中解决的问题
我在这张票上开了一张JIRA票
谢谢
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)