Q&A

CMS/프레임워크 Rhymix 2.1
개발 언어 PHP 8.4

DB에 대량의 row insert를 위해 파일을 로드하여 쿼리를 하려 합니다.

 

쿼리문  LOAD DATA LOCAL INFILE 'C:/tmp/111.csv' INTO TABLE rx_test FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (document_srl, member_srl);

 

모듈에서 처리한 svc파일을 해당위치에 저장하고 위와 같은 쿼리문을 

$statement =  sprintf(
    "LOAD DATA LOCAL INFILE '%s'
    INTO TABLE test
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    (document_srl, member_srl)",
    $csv_path);
$query = $oDB->query($statement);
$result = $oDB->fetch($query);

이와 같이 실행하였는데 SQLSTATE[42000]: Syntax error or access violation 가 발생합니다. 

 

디버그 패널에서 살펴보니

LOAD DATA LOCAL INFILE ''C:/tmp/111.csv' INTO `rx_TABLE` test FIELDS TERMINATED BY ',' LINES TERMINATED BY ' ' (document_srl, member_srl)

 

테이블 prefix부분과 LINES TERMINATED BY ' ' 인 부분(?여기는 확실치 않네요)이 문제되는 것 같은데 해결 방법이 있을까요?

ehii Lv. 2

댓글 2

  • 커스텀 쿼리를 시도하면 코어에서 테이블 접두사를 붙여주려고 하는데, 흔하지 않은 문법이 등장하면 저렇게 엉뚱한 곳에 접두사가 붙어서 오류날 때가 있습니다. $oDB->getHandle()->query() 하시면 접두사를 붙이지 않으니, 특수한 기능을 쓰실 때는 이 방법을 활용하세요.

     

    XML 쿼리가 아니라면 $oDB->fetch()는 사용하지 않습니다. INSERT 쿼리를 해놓고 딱히 fetch할 것도 없고요.

     

    $csv_path에 특수문자가 들어가면 문법에 어긋나게 될 수도 있으므로 (특히 윈도우는 백슬래시를 함부로 쓰는 경향이 있죠) 이것도 $oDB->addQuotes() 함수로 이스케이프 해주는 것이 안전합니다.

  • @기진곰

    친절한 답변 감사드립니다. 잘 되네요!