Spring의 ScriptUtils는 덤프에 코멘트가 포함된 코드를 무시합니다.
유닛 테스트를 위해 MariaDB 데이터베이스를 작성하려고 하는데 Spring의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:
SQL 스크립트를 제공된 구분 문자열로 구분된 개별 문장으로 분할합니다.각 개별 문장은 제공된 {@code List}에 추가됩니다.
스크립트 내에서는 지정된 {@code comment Prefix}가 적용됩니다.댓글 접두사로 시작하여 행 끝까지 확장되는 텍스트는 출력에서 제외됩니다.
마찬가지로 지정된 {@code blockCommentStartDelimiter} 및 {@code blockCommentEndDelimiter} 딜리미터가 적용됩니다.블록 코멘트로 둘러싸인 텍스트는 모두 출력에서 제외됩니다.
또한 인접한 여러 공백 문자가 하나의 공백으로 축소됩니다.
따라서 유틸리티에 대해 다시 한 번 살펴보면 다음과 같은 방법을 찾을 수 있습니다.
public static void executeSqlScript(
Connection connection,
EncodedResource resource,
boolean continueOnError,
boolean ignoreFailedDrops,
String commentPrefix,
String separator,
String blockCommentStartDelimiter,
String blockCommentEndDelimiter)
block comment remove funktion을 디세블로 할 수 없지만 다른 block comment delimiter를 사용하도록 설정할 수 있습니다.그래서 요령이라고 생각합니다.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;
마지막에.
최근 ScriptUtils에 의해 실행되는 SQL 쿼리에서 Oracle 힌트를 사용할 때 이와 유사한 문제가 발생했습니다.
위와 같이 "가짜" 구분 기호를 사용하면 해결되지만 ScriptUtils 자체에서 수정해야 할 문제인 것 같습니다.
https://jira.spring.io/browse/DATAJDBC-88에서 JIRA 티켓을 오픈했습니다.
감사해요.
언급URL : https://stackoverflow.com/questions/33144628/springs-scriptutils-ignores-code-containing-comments-in-dump
'programing' 카테고리의 다른 글
오류로 인해 MariaDB 백업 도구 Mariabackup이 실패 (0) | 2022.10.15 |
---|---|
PHP의 'explode'는 Python에게 어떤 의미입니까? (0) | 2022.10.15 |
1을 포함하는 어레이를 작성하는 방법...n (0) | 2022.10.15 |
$http의 각 IE 캐싱 문제 (0) | 2022.10.15 |
Prepared Statement를 여러 번 재사용 (0) | 2022.10.15 |