Working with fields[Prisma]

SnowCat·2023년 5월 22일
0

Prisma

목록 보기
7/10
post-thumbnail

소수

  • 소수를 입력하고 저장할 때는 Prisma.Decimal 자료형을 사용
import { PrismaClient, Prisma } from '@prisma/client'

const newTypes = await prisma.sample.create({
  data: {
    cost: new Prisma.Decimal(24.454545),
  },

BigInt

  • 자바스크립트에 내장된 BigInt를 사용하면 됨
import { PrismaClient, Prisma } from '@prisma/client'

const newTypes = await prisma.sample.create({
  data: {
    revenue: BigInt(534543543534),
  },
})
  • 만약 Prisma에서 받아온 객체에 BigInt가 포함된 경우, JSON.stringify를 다음과 같이 진행해야함
// 옵션없이 시도시 "Do not know how to serialize a BigInt" 오류 출력
JSON.stringify(
  this,
  (key, value) => (typeof value === 'bigint' ? value.toString() : value)
)

JSON

  • 데이터 구조가 일관되지 않거나 Prisma에 매핑을 할 수 없는 경우에는 자료구조로 JSON을 사용할 수 있음

JSON 필드 읽기, 쓰기

  • Prisma.JsonArray, Prisma.JsonObject 내장 클래스를 사용해 필드 내용을 통해 읽기 쓰기를 할 수 있음
const { PrismaClient, Prisma } = require('@prisma/client')

const user = await prisma.user.findFirst({
  where: {
    id: 9,
  },
})

// 예시 데이터:
// [{ name: 'Bob the dog' }, { name: 'Claudine the cat' }]

if (
  user?.extendedPetsData &&
  typeof user?.extendedPetsData === 'object' &&
  Array.isArray(user?.extendedPetsData)
) {
  const petsObject = user?.extendedPetsData as Prisma.JsonArray

  const firstPet = petsObject[0]
}
var json = [
  { name: 'Bob the dog' },
  { name: 'Claudine the cat' },
] as Prisma.JsonArray

const createUser = await prisma.user.create({
  data: {
    email: 'birgitte@prisma.io',
    extendedPetsData: json,
  },
})

JSON 필드 필터링

  • 쿼리로 비교할 값으로 json값을 주면 Prisma는 json이 일치하는지를 확인할 수 있음
var json = { [{ name: 'Bob the dog' }, { name: 'Claudine the cat' }] }

const getUsers = await prisma.user.findMany({
  where: {
    extendedPetsData: {
      equals: json,
    },
  },
})
var json = {
  extendedPetsData: [{ name: 'Bob the dog' }, { name: 'Claudine the cat' }],
}

const getUsers = await prisma.user.findMany({
  where: {
    extendedPetsData: {
      not: json,
    },
  },

JSON 속성 값으로 필터링

  • JSON의 path값을 적어주면 특정 속성값만을 조건으로 삼을 수 있음
const getUsers = await prisma.user.findMany({
  where: {
    extendedPetsData: {
      path: ['petName'],
      equals: 'Claudine',
    },
  },
})
const getUsers = await prisma.user.findMany({
  where: {
    extendedPetsData: {
      path: ['petType'],
      string_contains: 'cat',
    },
  },
})
  • JSON이 중첩되어 있는 경우 참조하고자 하는필드가 나올때까지 경로를 배열에 나열해주면 됨
const getUsers = await prisma.user.findMany({
  where: {
    AND: [
      { // user/extendedPetsData/pet2/petName이 Sunny인 데이터
        extendedPetsData: {
          path: ['pet2', 'petName'],
          equals: 'Sunny',
        },
      },
      {
        // user/extendedPetsData/pet2/features/furColor 값으로 black이 포함된 데이터
        extendedPetsData: {
          path: ['pet2', 'features', 'furColor'],
          string_contains: 'black',
        },
      },
    ],
  },
})

배열의 값 필터링

  • 배열의 값 자체를 필터링할때는 array_contains와 같은 속성을 사용하면 됨
const getUsers = await prisma.user.findMany({
  where: {
    extendedPetsData: {
      array_contains: ['Claudine'],
    },
  },
})
  • 만약 값이 json으로 중첩되어 있는 경우 앞서서와 마찬가지로 path를 작성하고 쿼리 옵션을 사용하면 됨
const getUsers = await prisma.user.findMany({
  where: {
    extendedPetsData: {
      path: ['cats', 'fostering'],
      array_contains: ['Fido'],
    },
  },
})
  • 반대로 배열내의 JSON값을 쿼리하고 싶다면, 비교하고자 하는 JSON 객체를 배열에 담아 전달하면 됨
const json = [{ status: 'expired', insuranceID: 92 }]

const checkJson = await prisma.user.findMany({
  where: {
    extendedPetsData: {
      path: ['insurances'],
      array_contains: json,
    },
  },
})
  • path에 index를 적어 특정 위치의 댓글만을 가져올 수도 있음
const getUsers = await prisma.user.findMany({
  where: {
    comments: {
      path: ['owned', '1'],
      string_contains: 'Bob',
    },
  },
})

출처:
https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields

profile
냐아아아아아아아아앙

0개의 댓글