prisma client API, 사용 예시

With·2022년 3월 20일
5

orm

목록 보기
1/1

index

  • data
  • where
  • select
  • connect
  • include

data [create, update]

record를 create하거나 update 할 때 들어갈 key와 value의 기입할 때 사용

const result = await client.product.create({
  data: {
    name : "",
    price: 12, 
    description: "",
    imgae: "",
  },
});

where [read]

검색하고자 하는 컬럼을 지정하고자 할 때 사용

// 특정 컬럼에 구분짓지 않고, 모든 product을 조회하겠다.
// "where이 없으면 모든 대상에서 조회하겠다" 라는 의미
const result = await client.product.findMany({}); 

// product의 컬럼 중에 id가 2인 모든 것을 조회하겠다.
const result = await client.product.findMany({
  where: {
    id: 2
  }
}); 

// product의 컬럼 중에 name이 '갤럭시'이고, price가 123 인 것을 모두 조회하겠다.
const result = await client.product.findMany({
  where: {
    name: '갤럭시',
    price: 123,
  }
});

gte, gt

  • gte: X : X 보다 크거나 같은 것을 가져옴
  • gt : Y : Y보다 큰 것을 가져옴

lte, lt

  • lte: X : X 보다 작거나 같은 것을 가져옴
  • lt : Y : Y보다 작은 것을 가져옴
const posts = await client.post.findMany({
  //.. 중략
  where: {
    latitude: {
      gte: parsedLatitude - 0.01,
      lte: parsedLatitude + 0.01,
    },
    longitude: {
      gte: parsedLongitude - 0.01,
      lte: parsedLongitude + 0.01,
    }
  }
});

select [read]

where에서 선택한 데이터 중에서 특정 key값만 추출하고자 할 때 사용

const result = await client.product.findMany({
  where: {
    id: 2,
  }, 
  select: {
    name: true,
    price: true,
  }
});

// { name: "", price: "" }

connect [create, update]

create 또는 update를 할 때만 사용 가능하며, 목적은 레코드를 추가할 때 @relation 관계에 있는 table의 어떠한 값과 연결시킬 것인지 지정하고자 할 때 사용한다. 아래 코드에서는 product을 추가할 때, 해당 product의 user, user 중에서 id가 어떤 것인지 지정한다. 이것을 사용하려면 양쪽의 field가 @relation으로 연결되어 있어야 한다.

const result = await client.product.create({
  data: {
    name : "",
    price: 12, 
    description: "",
    imgae: "",
    user: {
      connect: {
        id: 18,
      }
    }
  },
});

생성된 것을 조회하면, connect에서 연결했던 userId: 18 이 정보로 포함되어 있는 것을 확인 할 수 있다. 단순히 userId 18 뿐만 아니라, user의 전체 정보를 조회 할 수 있다.

[
  {
    id: 7,
    createdAt: 2022-03-20T14:24:13.100Z,
    updatedAt: 2022-03-20T14:24:13.101Z,
    userId: 18,
    image: 'xxx',
    name: '',
    price: 12,
    description: '12',
    user: {
      id: 18,
      phone: null,
      email: 'rem9238@kakao.com',
      name: 'Anonymous',
      avatar: null,
      createdAt: 2022-03-01T07:04:26.393Z,
      updatedAt: 2022-03-01T07:04:26.395Z
    }
  }
]

include [read]

관계를 이루고 있는 필드를 현재 조회한 쿼리에 포함시킬 때 사용

const result = await client.product.findMany({
  where: {
    id: 2, 
  },
  include: {
    user: true,
  }
});

조회 결과 : user와 product은 schema에서 @relation 되어 있음

[
  {
    id: 2,
    createdAt: 2022-03-13T10:46:04.141Z,
    updatedAt: 2022-03-20T12:48:06.522Z,
    userId: 19,
    image: 'xxx',
    name: '갤럭시',
    price: 123,
    description: '이것은 첫번째',
    user: {
      id: 19,
      phone: '01099025911',
      email: null,
      name: 'Anonymous',
      avatar: null,
      createdAt: 2022-03-02T15:06:12.018Z,
      updatedAt: 2022-03-02T15:06:12.019Z
    }
  }
]

+select와 함께 사용하기

const result = await client.product.findMany({
  where: {
    id: 2, 
  }, 
  include: {
    user: {
      select: {
        name: true,
        id: true,
      }
    }
  }
});

조회 결과

[
  {
    id: 2,
    createdAt: 2022-03-13T10:46:04.141Z,
    updatedAt: 2022-03-20T12:48:06.522Z,
    userId: 19,
    image: 'xxx',
    name: '갤럭시',
    price: 123,
    description: '이것은 첫번째',
    user: { id: 19, name: 'Anonymous' }
  }
]

_count

그리고 _count를 통해 relation을 통해 [ ]로 받아오는 컬럼의 값의 수를 response 할 수 있다. 클론 코딩에서는 post가 가지고 있는 answerwonderings의 갯수를 가져오도록 했다. answer는 post의 댓글의 갯수이고, wonderings 는 '궁금해요' 라는 기능의 갯수이다.

  const post = await client.post.findUnique({
    where: {
      id: +id.toString(),
    },
    include: {
      user: {
        select: {
          id: true,
          name: true,
          avatar: true,
        },
      },
      _count: { // include안에 들어가고, 가져오고 싶은 컬럼을 select해서 가져온다.
        select: {
          answers: true,
          wonderings: true,
        },
      },
    },
  });

connectOrCreate

고유 id 에 의해 기존 레코드를 연결하거나 또는 레코드가 존재하지 않으면, 레코드를 새로 생성할 때 사용한다.

// user : { phone: phone } 또는 { email: email } ==> phone과 email 모두 `@unique`

const token = await client.token.create({
    data: {
      payload, // token number
      // token의 user 정보는 where 정보를 조회 했을 때 
      // 이미 있으면, connect 하고
      // 없으면, { name: '', ...user } 로 user를 생성한다.
      // token 생성 쿼리에서 user를 생성할 수도 있다.
      user: {
        connectOrCreate: {
          where: {
            ...user,
          },
          create: {
            name: "Anonymous",
            ...user,
          },
        },
      },
    },
  });
profile
주니어 프론트엔드 개발자 입니다.

1개의 댓글

comment-user-thumbnail
2023년 10월 31일

prisma 처음 사용하면서 많이 애먹었는데 큰 도움이 됐습니다 감사합니다

답글 달기