[prisma] An operation failed because it depends on one or more records that were required but not found. Record to update not found.

💡 update error : An operation failed because it depends on one or more records that were required but not found. Record to update not found.

현재 팀에서 Prisma ORM을 통해 개발을 진행하고 있습니다.

Prisma는 타입추론을 제대로 지원하는 ORM이기 때문에 TypeORM 대신 사용하고 있습니다. 다만, 에러가 발생했을 때 추적이 쉽지 않습니다. 이유는 간단하게도 TypeORM보다 적기 때문입니다. 많은 분들이 TypeORM을 사용하고 있으며, 현재는 Prisma ORM이 많이 올라오기도 했죠.

그렇기 때문에 에러가 발생할 때 쉽게 찾고, 수정할 수 있도록 하나의 케이스를 가져와봤습니다. 짧은 글이며, 쉽게 해결할 수 있는 내용입니다. 바로 아래 에러입니다.

직역하자면 하나 이상의 레코드에 의존하는 것을 찾지 못해 요청에 실패했다는 의미입니다.

구글 번역기를 돌려도 뭔소리인가 합니다.

[prisma] An operation failed because it depends on one or more records that were required but not found. Record to update not found.
[prisma] An operation failed because it depends on one or more records that were required but not found. Record to update not found. 3

해결방법은 무엇일까요? 간단합니다.

해결 방법

💡 update 구문대신 updateMany 구문을 사용해주세요

위 에러는 prisma에서 update 함수를 통해 수정하려고 할 때 값이 존재하지 않기 때문에 나는 에러입니다. 당연히 없는 값을 업데이트를 했기 때문에 발생할 수 밖에 없는 에러입니다.

하지만 updateMany 함수를 사용한다면 성공하게 됩니다. 이유가 뭘까요?

그것은 update 함수가 Select 쿼리를 한번 던지는 것 때문에 발생하는 에러입니다. 즉, update 함수에서는 Select 쿼리로 해당하는 값을 찾고, 그 값이 있다면 Update 쿼리를 실행해 진행합니다. 여기서 Select가 중요한데요. Select 쿼리의 값이 없으면 위와 같은 에러를 발생하는 것이죠.

그래서 updateMany는 Select를 하지 않고, Update 쿼리를 던집니다. 그러면 UpdateMany만 사용하면 될까요? 아닙니다. prisma는 존재하지 않는 값에 대한 Update 쿼리에 대해 경고를 하고자 Select 쿼리를 추가했습니다. 그렇기 때문에 특정 값이 있는지 체크하기 위해서는 update 함수를 사용하는 것이 편합니다. 존재하지 않는 값에 대해 사용자가 알 수 있기 때문이죠.

특히 OCC(Optimistic Concurrency Control) 낙관적 잠금을 제공하기 위해서는 update 함수는 지금처럼 유지해야 합니다. 자세한 내용은 아래 링크를 참고하시면 좋습니다.

Optimistic concurrency control on updates

도움이 되시길 바랍니다.

감사합니다.

참고자료

https://chilldaysofmine.tistory.com/entry/prisma-update-error-An-operation-failed-because-it-depends-on-one-or-more-records-that-were-required-but-not-found-Record-to-update-not-found

Leave a Comment