Javascript/Node.js

[ Node.js] - prisma

algml0703 2022. 4. 5. 23:22
반응형

prisma 사용하기

아래의 명령어를 터미널에 입력한다.

> npm install prisma --save -dev
> npx prisma init

npx prisma init 명령어를 통해 prisma 사용을 위한 기본 구조가 생성된다.

위와 같은 폴더트리가 생성된다.

.env 파일의 내용을 수정해야 한다.

아래는 mysql 인 경우이다.

DATABASE_URL="mysql://root:mysql비밀번호@localhost:3306/prisma1"
// ex) mysql 비밀번호가 root이면 
// DATABASE_URL="mysql://root:root@localhost:3306/prisma1"
// DATABASE_URL="mysql://user:mysql비밀번호@localhost:mysql설정된port/데이터베이스이름"

prisma폴더의 schema.prisma파일 안의 내용도 아래와 같이 변경해줌

// 나는 mysql을 사용하므로 datasource db 안의 provider를 mysql로 수정해줌.
generator client {
  provider = "prisma-client-js"
}

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

데이터베이스의 모델 즉 테이블 생성하려면 위와 같은 파일 안에 아래와 같이 작성

model User {
  Id        Int    @id @default(autoincrement())
  username  String
  contact   String @unique
  createdAt String?
  updatedAt String?
  wallet    String?
}

위와 같이 작성 후

> npx prisma db push
생성한 테이블들을 연결된 데이터 베이스에 반영하여 주는 명령어이다.
> npx prisma db pull
연결된 데이터베이스 있는 테이블을 현재 서버에 불어와 생성하여 준다.

✅     테이블 간 관계설정

// models.ts
datasource db {
	provider = "mysql"
    url      = env("DATABASE_URL")
}
generator client {
    provider = "prisma-client-js"
}

model User {
  id      Int     @id  @default(autoincrement())
  email   String  @unique
  name    String?
  role    Role    @default(USER)
  posts   Post[]
  profile Profile?
}
  
model Profile {
  id      Int     @id  @default(autoincrement())
  bio     String
  user    User    @relation(fields: [userId], references: [id])
  userId  Int
}
// Profile의 userId는 User의 id와 연결됨
model Post {
  id         Int        @id  @default(autoincrement())
  createdAt  DateTime   @default(now())
  title      String
  published  Boolean    @default(false)
  author     User       @relation(fields: [authorId], references: [id])
  authorId   Int
  categories Category[] @relation(references: [id])
}
// Post는 authorId를 통해 User의 id와 연결

model Category {
  id    Int     @id  @default(autoincrement())
  name  String
  posts Post[]  @relation(references: [id])
}

enum Role {
  User
  Admin
}

출처 prisma 공식문서

 

✅    CRUD 작업시 사용법

> npm install @prisma/client
> prisma generate   // Generate Prisma Client

// @prisma/client를 통해 CRUD 작성 가능
prisma.ts 또는 prisma.js 파일 생성 후

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

export const prisma = new PrismaClient({});

사용하려는 파일 내에서 위의 파일을 불러와서 사용한다.
아래와 같이 사용

import * as express from 'express';
import {prisma} from '../prisma'
// 위의 경로는 실제 파일이 위치하는 경로를 설정.
export async function userCreate (req:express.Request,res:express.Response,next:express.NextFunction){
    try{
        const {username,contact} = req.body
        console.log(username,contact)
        const result = await prisma.user.create({
            data:{
                username:'mihee2',
                contact:'010-1111-11112'
            }
        })
        res.json(result)
    }catch(e){
        console.error(e)
    }
}

 

조건이 여러개인 경우

const result = await prisma.myTable.findMany({
    where: {
        AND: [
            { webId: id },
            { succeed: false }
        ]
    },
    orderBy: {
        createdAt: 'desc'
    },
    take: 1
});

 

페이지 처리시

const result = await prisma.myTable.findMany({
    skip: take * (page - 1),
    take: take
})

특정 컬럼값만 가져오기

const result = await prisma.myTable.findUnique({
    where: {
        id: id
    },
    select: {
        name: true,
        age: true,
        gender: true
    }
})

해당하는 데이터가 존재하면 데이터 업데이트 하고, 없으면 새롭게 생성

const result = await prisma.myTable.upsert({
    where: {
        id: id 
    },
    update: {
        token: refreshToken,
    },
    create: {
        token: refreshToken
    }
});

수량이 0보다 큰 값 가져오기

const product = await prisma.product.findMany({
    where: {
    	qty: {
           gt: 0
        }
    }
});

특정 컬럼값들의 수량 가져오기

const result = await prisma.item.aggregate({
    where: {
        AND: [
            {name: 'skirt'},
            {name: 'pants'}
        ]
    },
    _sum: {
        qty: true
    }
});

출처

https://www.prisma.io/express#express-tabs

 

Express & Prisma | Next-Generation ORM for SQL DBs

Prisma is a next-generation ORM for Node.js & TypeScript. It's the easiest way to build Express apps with MySQL, PostgreSQL & SQL Server databases.

www.prisma.io

https://www.prisma.io/docs/getting-started/quickstart

 

Quickstart: Getting started with TypeScript & SQLite

Get started with Prisma in 5 minutes. You will learn how to send queries to a SQLite database in a plain TypeScript script using Prisma Client.

www.prisma.io

https://www.prisma.io/docs/concepts/components/prisma-client/crud

 

CRUD (Reference)

How to perform CRUD with Prisma Client.

www.prisma.io

https://www.prisma.io/docs/concepts/database-connectors/mysql

반응형