node.js/Preisma ORM/mysql의 예 시도

요약:


이것은 이전 Prisma 초급편의 속편이다.이거 조작할 노트예요.
  • 예를 들어 Getting started를 시도했습니다.
  • 컨디션

  • node 14
  • prisma: 2.20.0
  • mysql: 5.7.33
  • 참고 자료


    https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch-node-mysql

    ■ 시도한 내용

  • 이상의 getting-started를 진행
  • mkdir hello-prisma
    cd hello-prisma
    
    
  • npm 등 prisma 초기화 증가
  • npm init -y
    npm install prisma --save-dev
    npm install @prisma/client
    npx prisma init
    
  • prisma/schema.prisma
  • datasource db {
      provider = "mysql"
      url      = env("DATABASE_URL")
    }
    
  • DATABASE_URL, .env
  • 로 설정
    사용자 이름: Powerd@localhost: 3306/DB 이름
    DB 생성 권한이 없습니다. 오류가 발생했습니다. 권한을 추가하거나 루트로 연결하면 실행할 수 있습니다.
    DATABASE_URL = 'mysql://johndoe:randompassword@localhost:3306/mydb'
    

  • schema 정의
    db 연결을 포함하는 파일은이하
  • https://gist.github.com/kuc-arc-f/8ce490b04f5a3f669d9bd59978ee8375
    model Post {
      id        Int      @default(autoincrement()) @id
      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     @default(autoincrement()) @id
      bio    String?
      user   User    @relation(fields: [userId], references: [id])
      userId Int     @unique
    }
    
    model User {
      id      Int      @default(autoincrement()) @id
      email   String   @unique
      name    String?
      posts   Post[]
      profile Profile?
    }
    
    
  • migrate 실행
  • npx prisma migrate dev --name init
    

    동작 확인

  • insert, find
  • index.js
    const { PrismaClient } = require('@prisma/client')
    
    const prisma = new PrismaClient()
    
    async function main() {
      await prisma.user.create({
        data: {
          name: 'Alice',
          email: '[email protected]',
          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 })
    }
    
    main()
      .catch((e) => {
        throw e
      })
      .finally(async () => {
        await prisma.$disconnect()
      })
    
    
    결과: node index.js에서 실행
    > node index.js
    
    [ { id: 1,
        email: '[email protected]',
        name: 'Alice',
        posts:
         [ { id: 1,
             createdAt: 2021-04-03T10:16:36.688Z,
             updatedAt: 2021-04-03T10:16:36.688Z,
             title: 'Hello World',
             content: null,
             published: false,
             authorId: 1 } ],
        profile: { id: 1, bio: 'I like turtles', userId: 1 } }
    ]
    
    
  • update
  • index.js
    async function main() {
      const post = await prisma.post.update({
        where: { id: 1 },
        data: { published: true },
      })
      console.log(post)
    }
    
    
  • 구현 후 업데이트 완료
  • > node index.js
    { id: 1,
      createdAt: 2021-04-03T10:16:36.688Z,
      updatedAt: 2021-04-03T23:56:19.440Z,
      title: 'Hello World',
      content: null,
      published: true,
      authorId: 1 }
    
    
    패키지 참조.json
    {
      "name": "prisma-mysql",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "prisma": "^2.20.1"
      },
      "dependencies": {
        "@prisma/client": "^2.20.1"
      }
    }
    

    추기

  • Next.제이스 샘플이 공개됐으니까.해봤어요
  • sqlite 버전이지만 상기 mysql 설정(schema.prisma 등)에서 사용할 수 있습니다
  • seed에서도 테스트 데이터를 읽을 수 있습니다.편리함
  • https://github.com/prisma/prisma-examples/tree/latest/javascript/rest-nextjs
    *추기: 2021/04/06
    TEXT형, String 추가db.Text, 지원
    textCol String? @db.Text
    https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference

  • 추기

  • find/IN 실행
  • https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#in
      const posts = await prisma.temp1.findMany({
        where: {
          id: { in: [6, 5] },
        },
        select: {
          name: true,
        },            
        orderBy: [
          {
            id: 'desc',
          },
        ],
      })
    
  • 그룹 by의 실행, select 프로젝트 지정
  • https://www.prisma.io/docs/concepts/components/prisma-client/select-fields
    https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#groupby
        const posts = await prisma.temp1.groupBy({
          by: ['name' ],
          select: {
            name: true,
          },
          sum: {
            price: true,
          },                  
        })
    
  • findMany : skip , take (pagination)
  • https://www.prisma.io/docs/concepts/components/prisma-client/pagination
        const posts = await prisma.task.findMany({
          orderBy: [
            {
              id: 'desc',
            },
          ],      
          skip: 0,
          take: 10,      
        })
    

    ■ 관련 페이지

  • Preisma ORM/sqlite 테스트의 예
  • https://zenn.dev/knaka0209/articles/cbaad75d6df881

    좋은 웹페이지 즐겨찾기