🐳 문제 상황
회사에서 prismaORM 을 사용하고 있다.
upsert 기능을 사용해서 데이터를 삽입하는 중에
`Unique constraint failed on the fields` 에러가 발생했다.
근데 생각해보니 도대체 어떻게 Upsert 에서 Unique Constaint 에러가 발생한 걸까 ?
데이터가 없다면 삽입하고 Unique Constraint 에 걸리면 업데이트 하는데...
이유를 함께 찾아보지
🐳 가정
생각한 가정은 prisma 가 내부적으로 insert into ... on conflict ... do update 와 같은 upsert 기능을 사용하지 않는다는 것이다.
한 번 upsert 쿼리를 호출해 확인해보자
쿼리 실행 결과
쿼리 실행 조건 : pk 값인 id를 upsert 의 where 조건 절에 입력해 주었다.
쿼리 실행 결과 : Upsert 호출 시 where 절에 입력한 조건을 통해 해당 데이터가 존재하는지 여부를 select query 를 통해 확인한 후에 데이터가 이미 존재하는 경우 Update 쿼리를 호출하는 것을 확인할 수 있었다.
가정한 것처럼 DB가 지원하는 upsert 기능을 지원하는 것이 아니라 select 를 통해 데이터 존재 유무를 파악하고 update/insert 를 호출하고 있었다.
🐳 upsert 조건 변경해서 쿼리 실행해보기 ❗️충격 주의
이번에는 PK 가 아닌 다른 Unique 키를 Where 조건으로 upsert 쿼리를 실행해보자
쿼리 실행 결과
쿼리 실행 조건 : pk 가 아닌 Unique 키를 upsert 의 where 조건 절에 입력해 주었다.
쿼리 실행 결과 : ❗️prisma 의 upsert 호출 시 DB 가 지원하는 INSERT INTO ... ON CONFLICT ... DO UPDATE 기능을 사용하고 있었다 ..
🐳 Prisma 가 DB 가 지원하는 Upsert 기능을 사용하는 조건은 뭘까 ?
한 번 Prisma 공식문서를 찾아 들어가보자 ! ( upsert 문서 )
5가지 조건을 충족시켜야 DB가 제공하는 upsert 기능을 사용한다고 한다.
처음에 upsert query의 where 절에 PK 값인 id 를 설정했을 때는 다섯 번째 조건을 만족시키지 못한 것으로 보인다.
where 절에는 id 를 사용하지만 create 에서 id는 지정하지 않기 때문이다.
( 그런데 5번째 조건을 만족시키려면 id를 upsert 의 where 절에 줄 수 없는 거 아닌가 .. ? create 할 때 id를 입력하는 경우는 흔하지 않을텐데 ... prisma 너란 녀석 ..)
🐳 결론
- prisma 의 upsert 기능을 사용할 때는 위의 다섯가지 조건을 확인하자
개인적으로 prisma ORM 자체를 비추천한다 ...
'Node.js' 카테고리의 다른 글
[ExpressJS] Javascript로 Enum 사용하기 - 오픈카톡방 공유 후기 (0) | 2024.01.20 |
---|---|
TypeORM v0.3에서 Repository 구현 및 테스트 코드 구현 (0) | 2023.07.08 |
Typescript로 Jest 사용하기 (0) | 2023.07.06 |
Layered Architecture 구현하기 (0) | 2023.07.05 |
TypeORM + TypeScript + Express 개발환경 세팅 (0) | 2023.07.03 |