generate
migrate
push
pull
export
check
up
studio
Drizzle 스키마를 기반으로 단 한 줄로 GraphQL 서버를 생성할 수 있습니다. 또한 커스텀 쿼리와 뮤테이션을 쉽게 추가하여 기능을 확장할 수 있습니다.
drizzle-orm 버전이 최소 0.30.9 이상인지 확인하고, 필요한 경우 업데이트하세요:
drizzle-orm
0.30.9
npm i drizzle-orm@latest
yarn add drizzle-orm@latest
pnpm add drizzle-orm@latest
bun add drizzle-orm@latest
npm i drizzle-graphql @apollo/server graphql
yarn add drizzle-graphql @apollo/server graphql
pnpm add drizzle-graphql @apollo/server graphql
bun add drizzle-graphql @apollo/server graphql
import { buildSchema } from 'drizzle-graphql'; import { drizzle } from 'drizzle-orm/...'; import client from './db'; import { ApolloServer } from '@apollo/server'; import { startStandaloneServer } from '@apollo/server/standalone'; import * as dbSchema from './schema'; const db = drizzle({ client, schema: dbSchema }); const { schema } = buildSchema(db); const server = new ApolloServer({ schema }); const { url } = await startStandaloneServer(server); console.log(`🚀 Server ready at ${url}`);
import { integer, serial, text, pgTable } from 'drizzle-orm/pg-core'; import { relations } from 'drizzle-orm'; export const users = pgTable('users', { id: serial('id').primaryKey(), name: text('name').notNull(), }); export const usersRelations = relations(users, ({ many }) => ({ posts: many(posts), })); export const posts = pgTable('posts', { id: serial('id').primaryKey(), content: text('content').notNull(), authorId: integer('author_id').notNull(), }); export const postsRelations = relations(posts, ({ one }) => ({ author: one(users, { fields: [posts.authorId], references: [users.id] }), }));
npm i drizzle-graphql graphql-yoga graphql
yarn add drizzle-graphql graphql-yoga graphql
pnpm add drizzle-graphql graphql-yoga graphql
bun add drizzle-graphql graphql-yoga graphql
import { buildSchema } from 'drizzle-graphql'; import { drizzle } from 'drizzle-orm/...'; import { createYoga } from 'graphql-yoga'; import { createServer } from 'node:http'; import * as dbSchema from './schema'; const db = drizzle({ schema: dbSchema }); const { schema } = buildSchema(db); const yoga = createYoga({ schema }); const server = createServer(yoga); server.listen(4000, () => { console.info('Server is running on http://localhost:4000/graphql'); });
buildSchema()는 표준 graphql SDK를 사용하여 스키마와 타입을 생성합니다. 따라서 이 출력은 이를 지원하는 모든 라이브러리와 호환됩니다.
buildSchema()
graphql
스키마를 커스터마이징하려면 entities 객체를 사용하여 새로운 스키마를 직접 만들 수 있습니다:
entities
import { buildSchema } from 'drizzle-graphql'; import { drizzle } from 'drizzle-orm/...'; import { GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLSchema } from 'graphql'; import { createYoga } from 'graphql-yoga'; import { createServer } from 'node:http'; import * as dbSchema from './schema'; const db = drizzle({ schema: dbSchema }); const { entities } = buildSchema(db); // 쿼리나 뮤테이션 중 원하는 부분만 선택할 수 있습니다. const schema = new GraphQLSchema({ query: new GraphQLObjectType({ name: 'Query', fields: { // 생성된 쿼리 중 원하는 것만 선택 users: entities.queries.users, customer: entities.queries.customersSingle, // 커스텀 쿼리 생성 customUsers: { // 원본 스키마의 타입을 재사용하고 커스터마이징 type: new GraphQLList(new GraphQLNonNull(entities.types.UsersItem)), args: { // 입력도 재사용 가능 where: { type: entities.inputs.UsersFilters }, }, resolve: async (source, args, context, info) => { // 커스텀 로직 작성 const result = await db.select(schema.users).where()... return result; }, }, }, }), // 뮤테이션에도 동일한 규칙 적용 mutation: new GraphQLObjectType({ name: 'Mutation', fields: entities.mutations, }), // 스키마 내부에서 타입이 필요한 경우 types: [...Object.values(entities.types), ...Object.values(entities.inputs)], }); const yoga = createYoga({ schema, }); const server = createServer(yoga); server.listen(4000, () => { console.info('서버가 http://localhost:4000/graphql에서 실행 중입니다.'); })