NodeJs용 MariaDB 커넥터 | 존재하지 않는 경우 값을 삽입하는 방법
풀에서 일괄 쿼리를 실행하려고 합니다.쿼리 자체는 간단하지만 NodeJS Connector에 문제가 있습니다.
'?' 자리 표시자에 대한 쿼리는
INSERT INTO region (region_code, country_code, continent_code) SELECT * FROM
(SELECT ?, ?, ?) AS tmp WHERE NOT EXISTS (SELECT region_code FROM region WHERE region_code = ?) LIMIT 1
제가 달성하고자 하는 것은 삽입하기 전에 값이 있는지 확인하는 것입니다. 제가 사용하는 TS 코드는 다음과 같습니다.
const INSERT_REGION =
'INSERT INTO region (region_code, country_code, continent_code) SELECT * FROM
(SELECT ?, ?, ?) AS tmp WHERE NOT EXISTS (SELECT region_code FROM region WHERE region_code = ?) LIMIT 1';
const insertRegionParam = [['ITC1', 'ITA', 'EU', 'ITC1'] , ['ITP1', 'ITA', 'EU', 'ITP1'] ]
private insertRegions$(insertRegionParam: string[][]) {
return from(this.pool.batch(INSERT_REGION, insertRegionParam)).pipe(
catchError((err: mdb.SqlError) => throwError(() => err))
);
}
다음 오류가 발생합니다.
R_DUP_FIELDNAME: Duplicate column name '?'
sql: INSERT INTO region (region_code, country_code, continent_code) SELECT * FROM
(SELECT ?, ?, ?) AS tmp WHERE NOT EXISTS (SELECT region_code FROM region WHERE region_code = ?) LIMIT 1
at /code/dist/resources/regions-sectors/regions-sectors.controller.js:24:22
at /code/node_modules/rxjs/dist/cjs/internal/operators/catchError.js:13:51
at OperatorSubscriber._this._error (/code/node_modules/rxjs/dist/cjs/internal/operators/OperatorSubscriber.js:43:21)
at Subscriber.error (/code/node_modules/rxjs/dist/cjs/internal/Subscriber.js:60:18)
at Subscriber._error (/code/node_modules/rxjs/dist/cjs/internal/Subscriber.js:84:30)
at Subscriber.error (/code/node_modules/rxjs/dist/cjs/internal/Subscriber.js:60:18)
at Observable.init [as _subscribe] (/code/node_modules/rxjs/dist/cjs/internal/observable/throwError.js:8:58)
at Observable._trySubscribe (/code/node_modules/rxjs/dist/cjs/internal/Observable.js:41:25)
at /code/node_modules/rxjs/dist/cjs/internal/Observable.js:35:31
at Object.errorContext (/code/node_modules/rxjs/dist/cjs/internal/util/errorContext.js:22:9)
예를 들어 문자열이 구문 분석되지 않은 경우
다음이 있습니다.
FROM (SELECT ?, ?, ?) AS tmp
하위 쿼리에 가입하거나 하위 쿼리에서 선택할 때, 이렇게 형성된 "테이블"(이 경우 tmp)은 이름으로 열을 사용하지 않는 컨텍스트에서도 각 열에 대해 고유한 이름을 가져야 합니다.임의의 이름을 지정할 수 있습니다.
FROM (SELECT ? x, ? y, ? z) AS tmp
그러나 다음 값을 반영하는 이름을 사용하는 것이 좋습니다.
FROM (SELECT ? region_code, ? country_code, ? continent_code) AS tmp
언급URL : https://stackoverflow.com/questions/76096073/mariadb-connector-for-nodejs-how-to-insert-value-if-not-exists
'programing' 카테고리의 다른 글
공유 메모리 할당 (0) | 2023.06.06 |
---|---|
이러한 파일 또는 디렉터리 "제한"이 없습니다.Alpine Linux에 Pillow를 설치할 때 h" (0) | 2023.06.06 |
루비의 "for" vs "each" (0) | 2023.06.06 |
'액세스-컨트롤-오리진 허용' 헤더의 작동 방식은 무엇입니까? (0) | 2023.06.06 |
모두 안드로이드입니다.지원 라이브러리는 정확히 동일한 버전 사양을 사용해야 합니다. (0) | 2023.06.06 |