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 ' ' 인 부분(?여기는 확실치 않네요)이 문제되는 것 같은데 해결 방법이 있을까요?
댓글 2
커스텀 쿼리를 시도하면 코어에서 테이블 접두사를 붙여주려고 하는데, 흔하지 않은 문법이 등장하면 저렇게 엉뚱한 곳에 접두사가 붙어서 오류날 때가 있습니다. $oDB->getHandle()->query() 하시면 접두사를 붙이지 않으니, 특수한 기능을 쓰실 때는 이 방법을 활용하세요.
XML 쿼리가 아니라면 $oDB->fetch()는 사용하지 않습니다. INSERT 쿼리를 해놓고 딱히 fetch할 것도 없고요.
$csv_path에 특수문자가 들어가면 문법에 어긋나게 될 수도 있으므로 (특히 윈도우는 백슬래시를 함부로 쓰는 경향이 있죠) 이것도 $oDB->addQuotes() 함수로 이스케이프 해주는 것이 안전합니다.
친절한 답변 감사드립니다. 잘 되네요!