앞서 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
내 예전 게시물과 위 공식 사이트를 참고하는 것이 좋다.
이제 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개 이상인 게시물이 하나 이상 있는 가장 최근에 생성된 사용자 를 반환합니다.
- 내림차순 ID로 사용자 정렬(가장 큰 것부터) - 가장 큰 ID가 가장 최근의 것입니다.
- 좋아요가 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
'🌸 GraphQL' 카테고리의 다른 글
GraphQL server 공식문서 참고 (0) | 2022.03.26 |
---|---|
useQuery, useLazyQuery (공식 문서 참고) (1) | 2022.03.08 |
nexus 이해하기3 (공식문서 참고) (0) | 2022.02.26 |
nexus 이해하기2 (공식문서 참고) (0) | 2022.02.26 |
nexus 이해하기1 (공식문서 참고) (0) | 2022.02.26 |