[Prisma] Null 과 undefined

가영·2021년 5월 21일
1

https://www.prisma.io/docs/concepts/components/prisma-client/null-and-undefined#use-case-null-and-undefined-in-a-graphql-resolver
이 글을 번역해서 정리

prisma client는 nullundefined를 다음과 같이 구분한다:

  • null이다.
  • undefined아무 것도 하지 않음을 의미한다.

다음 예시에서 emailInputnull일 경우에 쿼리셋은 emailundefined로 설정한다. 👉🏻 업데이트에 emailInput을 포함하지 않겠다는 의미이다.

const update = await prisma.user.update({
  where: {
    id: 1,
  },
  data: {
    name: "Petunia",
   email: emailInput != null ? emailInput : undefined, // If null, don't include in update!
  },
});

field value를 undefined로 설정하면 그냥 그 field를 비워두는 거랑 똑같다.

반면에, 다음과 같이
email을 mandatory field로 설정하고 싶은, null이 들어오면 안되는 경우에는 다음과 같이 해준다.

email: isValid(emailInput) ? emailInput : null, // email is a mandatory field!

만약 emailInput이 valid하지 않으면 null이 들어가게 될 거고, typescript는 다음과 같은 오류를 뿜는다.

Type 'null' is not assignable to type 'string'. ts(2322)

nullundefined가 조건에 미치는 영향

프리자마가 nullable values를 다루는 방식으로 조건으로 필터링을 하는 경우에 우리는 예상했던 것과는 다른 결과를 얻을 수도 있다.

프리즈마의 operator들이 필터 개수에 따라 처리하는 방식을 정리한 표다.

Operator0 filters1 filtern filters
ORreturn empty listvalidate single filtervalidate all filters
ANDreturn all itemsvalidate single filtervalidate all filters
NOTreturn all itemsvalidate single filtervalidate all filters
interface FormData {
  name: string;
  email?: string;
}

const formData: FormData = {
  name: 'Emelie'
}

const users = await prisma.user.findMany({
  where: {
    OR: [
      {
        email: {
          contains: formData.email
        }
      }
    ]
  }
})

// returns: []

위의 예시와 같이 OR 연산자 안에서 undefined 를 사용할 경우 empty list가 반환된다

반면에 ANDNOT 연산자 안에서 undefined를 사용하면 모든 유저가 반환된다.

const users = await prisma.user.findMany({
  where: {
    AND: [
      {
        email: {
          contains: formData.email
        }
      }
    ]
  }
})

// returns: { id: 1, email: 'ems@boop.com', name: 'Emelie' }

const users = await prisma.user.findMany({
  where: {
    NOT: [
      {
        email: {
          contains: formData.email
        }
      }
    ]
  }
})

// returns: { id: 1, email: 'ems@boop.com', name: 'Emelie' }

0개의 댓글