programing

Spring의 ScriptUtils는 덤프에 코멘트가 포함된 코드를 무시합니다.

shortcode 2022. 10. 15. 08:48
반응형

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

반응형