TIL 41 | Prisma client, Create & Read

dabin *.◟(ˊᗨˋ)◞.*·2021년 9월 20일
0

Database

목록 보기
6/6
post-thumbnail

prisma client란?

Prisma로 연결되어 있는 데이터베이스의 테이블들을 쉽게 접근할 수 있게 해주는 client 역할을 한다. 쉽게 생각하면, prisma를 편리하게 사용할 수 있게끔 만드는 라이브러리다. 이것을 사용하게 되면 prisma.schema파일에서 정의한 테이블이나 칼럼의 이름을 직접 사용할 수 있게 된다. Prisma.tablename과 같은 방식으로 접근할 수 있다.

설치

npm install @prisma/client --save

설치를 하면 prisma generate라는 명령어도 함께 실행되기 때문에 prisma.schema 파일을 읽어서 모델 형태에 맞는 client를 생성한다. 따라서 파일을 변경하면 명령어를 다시 실행해야 client에 반영된다. client사용시 아래와 같이 작성한다.

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

Prisma에서 Create & Read 기능 구현

prisma client까지 설치했다면, prisma에서 데이터를 생성하거나 데이터를 읽는 기능을 만들어보자. prisma의 메서드를 사용하여 구현하거나 sql문을 직접 사용할 수도 있다.

메서드 사용

//create
app.post('/categories', async (req, res) => {
  const category = await prisma.category.create({
    data: {
      name: '천국 가는 음료',
    },
  });

  res.json(category);
});

//read
app.get('/products', async (req, res) => {
  const products = await prisma.drink.findMany();

  res.json(products);
});

[비동기 처리]
자바스크립트는 원래 순서대로 처리된다. 하지만 한 줄의 코드가 너무 오래 걸리면 밑에 있는 코드들이 동작할 수 없다. 따라서 오래 걸릴만한 코드를 잠시 다른 곳이 빼두고 빠르게 처리할 수 있는 코드부터 실행하고 빼둔 코드들을 가져와서 다시 실행한다. 즉, 비동기적으로 실행하게 한다.
오래 걸리는 작업 중 대표적인 것은 Database와 통신하는 것이다. DB도 결국 서버고, 서버와 서버간 연결(통신)은 오래 걸리기 때문에 보통 비동기적으로 실행된다. fetch함수가 비동기인 것을 생각하면 된다.
[async & await]
요청한 자료를 반환해야할 때 함수 내의 로직이 끝날 때 까지 기다린 다음에 데이터를 반환해야 요청받은 데이터를 모두 반환할 수 있다. 따라서 await을 사용해야 한다.

queryRaw

메서드는 ORM마다 다르기 때문에 sql문을 사용하여 코드 작성을 연습해보자. 백틱과 ;사용에 주의하자.

//create 
app.post('/categories', async (req, res) => {
  await prisma.$queryRaw`
    INSERT INTO categories (name)
    VALUES ('천국 가는 음료');
  `;
//INSERT INTO문은 ORM처럼 최근 추가한 데이터를 반환하지 않기 때문에 추가로 작성한다.
//queryRaw 결과는 항상 배열이기 때문에 비구조화 해서 객체 하나만 반환하게 만들어준다.
  const [category] = await prisma.$queryRaw`
    SELECT *
    FROM categories
    ORDER BY id DESC
    LIMIT 1
  `;

  res.json(category);
})

//read
app.get('/products', async (req, res) => {
  const products = await prisma.$queryRaw`
    SELECT p.id, p.name, p.category_id, p.korean_name, p.english_name
    FROM products p
  `;

  res.json(products);
});
//SQL문만 봐도 어떤 정보가 들어오는지 알게 만들기 위해 * 대신 하나하나 적어주는 것이 좋다. 

//특정 product 불러오기 
app.get('/products/:id', async (req, res) => {
  const { id } = req.params;
  const [product] = await prisma.$queryRaw`
	  SELECT p.id, p.name, p.category_id, p.korean_name, p.english_name
	  FROM procducts p
	  WHERE p.id=${id}
`;

  res.json(product);
});
profile
모르는것투성이

0개의 댓글