백엔드/Prisma

Prisma 튜토리얼

SeungYn 2024. 2. 27. 18:57

1. Creact project setup

타입스크립트 환경을 위한 라이브러리 설치 및 프리즈마 설치

npm init -y 
npm install prisma typescript ts-node @types/node --save-dev

 

타입스크립트 세팅

npx tsc --init

 

프리즈마 초기 세팅

npx prisma init

npx prisma init 명령어 실행 후 아래 같은 폴더구조가 생기는데

prisma 폴더에는 프리즈마 관련 파일

.env 환경설정 파일이 생깁니다.

./
├── .env
├── package-lock.json
├── package.json
├── prisma
│   └── schema.prisma
└── tsconfig.json

2. Connect your database

prisma/schema.prisma 파일을 보면 아래와 같이 작성 돼있습니다

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

 

Mysql을 사용하려면 아래처럼 변경합니다.

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

 

이후 .env 파일 내용만 자신의 db 설정에 맞게 변경해 주면 db연결세팅은 끝납니다.

DATABASE_URL="mysql://root:randompassword@localhost:3306/mydb"

3. Using Prisma Migrate

스키마 작성을 위해 prisma/schema.prisma 파일을 수정합니다.

// This is your Prisma schema file,
// learn more about it in the docs: <https://pris.ly/d/prisma-schema>

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: <https://pris.ly/cli/accelerate-init>

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model Post {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  title     String   @db.VarChar(255)
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}

model Profile {
  id     Int     @id @default(autoincrement())
  bio    String?
  user   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  name    String?
  posts   Post[]
  profile Profile?
}

 

이후 npx prisma migrate dev --name init 를 실행시킵니다.

npx prisma migrate dev --name init

 

위의 명령어를 실행시키면 sql 파일을 작성후 sql문을 실행시킵니다. 그 후 generator이 명시되어 있고 @prisma/client가 설치되어있지 않다면 설치합니다.

@prisma/client은 디비를 조작할 수 있도록하는 라이브러리입니다.

스키마가 수정되면 prisma migrate dev or prisma db push를 호출하여 항상 db와 동기화가 되도록합니다.

 

아래는 mysql 결과입니다.

명령어 이후 db

4. Querying the database

프로젝트 폴더 맨 위에 Index.ts 만들어 prisma를 이용하여 db를 조작할 수 있습니다.

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

const prisma = new PrismaClient();

async function main() {
  // 생성
  await prisma.user.create({
    data: {
      name: 'Alice',
      email: 'alice@prisma.io',
      posts: {
        create: { title: 'Hello World' },
      },
      profile: {
        create: { bio: 'I like turtles' },
      },
    },
  });

  const allUsers = await prisma.user.findMany({
    include: {
      posts: true,
      profile: true,
    },
  });
  console.dir(allUsers, { depth: null });

  // 업데이트
  const post = await prisma.post.update({
    where: { id: 1 },
    data: { published: true },
  });
  console.log(post);
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });