🌸 GraphQL

데이터 유지를 prisma 를 통해 하자 (CRUD)

ji-hyun 2022. 2. 28. 17:40

앞서 graphQL 의 스키마 작성을 nexus 를 통해 해보았다.

(참고로 예전 게시물과 이어지는 포스팅이다.)

2022.02.26 - [GraphQL] - nexus 이해하기1 (공식문서 참고)

2022.02.26 - [GraphQL] - nexus 이해하기2 (공식문서 참고)

2022.02.26 - [GraphQL] - nexus 이해하기3 (공식문서 참고)

 

이제 DB 와의 상호작용을 prisma client 를 통해 할 수 있도록 해보겠다.

 

 

 

 

 

 

prisma 를 통해 이렇게 바꿀 수가 있다.!!!

 

// api/graphql/Post.ts
// ...

export const PostQuery = extendType({
  type: 'Query',
  definition(t) {
    t.list.field('drafts', {
      type: 'Post',
      resolve(_root, _args, ctx) {
        return ctx.db.post.findMany({ where: { published: false } })  // filter 대신
      },
    })
    t.list.field('posts', {
      type: 'Post',
      resolve(_root, _args, ctx) {
        return ctx.db.post.findMany({ where: { published: true } })   // filter 대신
      },
    })
  },
})




// mutation

export const PostMutation = extendType({
  type: 'Mutation',
  definition(t) {
    t.field('createDraft', {
      type: 'Post',
      args: {
        title: nonNull(stringArg()),
        body: nonNull(stringArg()),
      },
      resolve(_root, args, ctx) {
        const draft = {
          title: args.title,
          body: args.body,
          published: false,
        }
        return ctx.db.post.create({ data: draft })   // create
      },
    })

    t.field('publish', {
      type: 'Post',
      args: {
        draftId: nonNull(intArg()),
      },
      resolve(_root, args, ctx) { 
        return ctx.db.post.update({      // update
          where: {
            id: args.draftId
          },
          data: {
            published: true,
          },
        })
      },
    })
  },
})

 

 

 

 

 

https://nexusjs.org/docs/getting-started/tutorial/chapter-persisting-data-via-prisma

 

5. Persisting data (via Prisma)

5. Persisting data (via Prisma)

nexusjs.org

 

 

내 예전 게시물과 위 공식 사이트를 참고하는 것이 좋다.

 

 

 

 

 

이제 prisma CRUD 를 배워야겠다.

이건 prisma 공식 문서가 설명 잘 되어있다.

 

 

 

 

 

1. create

 

user = {
      email: 'elsa@prisma.io',
      name: 'Elsa Prisma',
    }
    
    
    const createUser = await prisma.user.create({ data: user })

 

 

 

const createMany = await prisma.user.createMany({
  data: [
    { name: 'Bob', email: 'bob@prisma.io' },
    { name: 'Bobo', email: 'bob@prisma.io' }, // Duplicate unique key!
    { name: 'Yewande', email: 'yewande@prisma.io' },
    { name: 'Angelique', email: 'angelique@prisma.io' },
  ],
  skipDuplicates: true, // Skip 'Bobo'
})

 

 

 

 

 

 

 

 

2. read

 

// By unique identifier
const user = await prisma.user.findUnique({
  where: {
    email: 'elsa@prisma.io',
  },
})

// By ID
const user = await prisma.user.findUnique({
  where: {
    id: 99,
  },
})

 

 

 

 

모든 User 레코드를 반환한다.

 

const users = await prisma.user.findMany()

 

 

 

 

 

특정 기준과 일치하는 첫번째 레코드를 가져오기

 

다음과 같은 findFirst 쿼리는 좋아요가 100개 이상인 게시물이 하나 이상 있는 가장 최근에 생성된 사용자 를 반환합니다.

  1. 내림차순 ID로 사용자 정렬(가장 큰 것부터) - 가장 큰 ID가 가장 최근의 것입니다.
  2. 좋아요가 100개 이상인 게시물이 하나 이상 있는 첫 번째 사용자를 내림차순으로 반환

 

const findUser = await prisma.user.findFirst({
    where: {
      posts: {
        some: {
          likes: {
            gt: 100
          }
        }
      }
    },
    orderBy: {
      id: "desc"
    }
  })
}

 

 

 

 

 

필터링된 레코드 목록 가져오기

Prisma Client는 레코드 필드 및 관련 레코드 필드에 대한 필터링 을 지원합니다.

 

 

1. 단일 필드 값으로 필터링

다음 쿼리는 다음 User으로 끝나는 이메일이 있는 모든 레코드를 반환합니다 "prisma.io".

 

 

  const users = await prisma.user.findMany({
    where: {
      email: {
        endsWith: "prisma.io"
      }
    },
  }

 

 

 

 

 

 

 

2. 여러 필드 값으로 필터링

다음 쿼리는 연산자 조합을 사용합니다. 이름이 E로 시작하는 사용자 또는 프로필 보기가 1개 이상 있는 관리자를 반환하려면:

 

const users = await prisma.user.findMany({
  where: {
    OR: [
      {
        name: {
          startsWith: 'E',
        },
      },
      {
        AND: {
          profileViews: {
            gt: 0,
          },
          role: {
            equals: 'ADMIN',
          },
        },
      },
    ],
  },
})

 

 

 

 

다음 쿼리는 전자 메일이 prisma.io 로 끝나고 게시 되지 않은 게시물(some)이 하나 이상 있는 사용자를 반환합니다.

 

  const users = await prisma.user.findMany({
    where: {
      email: {
        endsWith: "prisma.io"
      },
      posts: {
        some: {
          published: false
        }
      }
    },
  }

 

 

 

 

 

 

4. 필드 하위 집합 선택

다음 findUnique 쿼리는 특정 레코드 의 및 필드 select를 반환하는 데 사용합니다.

 

const user = await prisma.user.findUnique({
  where: {
    email: 'emma@prisma.io',
  },
  select: {
    email: true,
    name: true,
  },
})

 

결괏값

{ email: 'emma@prisma.io', name: "Emma" }

 

 

 

 

 

 

5. 관련 레코드 필드의 하위 집합 선택

 

다음 쿼리는 중첩 select을 사용하여 반환합니다.

 

  • 사용자의 email
  • 각 게시물 의 필드 likes

 

const user = await prisma.user.findUnique({
  where: {
    email: 'emma@prisma.io',
  },
  select: {
    email: true,
    posts: {
      select: {
        likes: true,
      },
    },
  },
})

 

 

 

결괏값:

 

{ email: 'emma@prisma.io', posts: [ { likes: 0 }, { likes: 0 } ] }

 

 

 

 

 

다음 쿼리는 모든 ADMIN 사용자를 반환하고 결과에 각 사용자의 게시물을 포함합니다.

 

const users = await prisma.user.findMany({
  where: {
    role: 'ADMIN',
  },
  include: {
    posts: true,
  },
})

 

 

 

결괏값

 

{
    "id": 38,
    "name": "Maria",
    "email": "maria@prisma.io",
    "profileViews": 20,
    "role": "ADMIN",
    "coinflips": [
        true,
        false,
        false
    ],
    "posts": []
},
{
    "id": 39,
    "name": "Oni",
    "email": "oni2@prisma.io",
    "profileViews": 20,
    "role": "ADMIN",
    "coinflips": [
        true,
        false,
        false
    ],
    "posts": [
        {
        "id": 25,
        "authorId": 39,
        "title": "My awesome post",
        "published": true,
        "comments": null,
        "views": 0,
        "likes": 0
        }
    ]
}

 

 

 

 

 

UD 는 생략..

아래 참고

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

 

CRUD (Reference)

How to perform CRUD with Prisma Client.

www.prisma.io