Automatically create GraphQL schema or customizable schema config fields from Drizzle ORM schema
This repository is a fork of the original drizzle-orm/drizzle-graphql. Since the original repository is no longer actively maintained, I have taken the initiative to continue its development and maintenance. Contributions and feedback from the community are welcomed to help improve this project.
For personal opinions, I've migrated whole stack from npm, pnpm to bun as well as other tooling changes mentioned below.
- Add "Count" to generated types for count queries (PostgreSQL only for now!)
- Fix handling of JSONB
- Fix handling of tsvector types
- Fix handling of generated columns
- Export essential builder functions for external usage
- Replace
vitestwithbun:testfor testing - Replace
tsupwithbunupfor building - Use
biomejsfor linting and formatting
-
Pass your drizzle database instance and schema into builder to generate
{ schema, entities }object -
Use
schemaif pre-built schema already satisfies all your needs. It's compatible witn any server that consumesGraphQLSchemaclass instanceExample: hosting schema using GraphQL Yoga
import { createServer } from 'node:http' import { createYoga } from 'graphql-yoga' import { buildSchema } from '@woooow/drizzle-graphql' // db - your drizzle instance import { db } from './database' const { schema } = buildSchema(db) const yoga = createYoga({ schema }) server.listen(4000, () => { console.info('Server is running on http://localhost:4000/graphql') })
-
If you want to customize your schema, you can use
entitiesobject to build your own new schemaimport { createServer } from 'node:http' import { GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLSchema } from 'graphql' import { createYoga } from 'graphql-yoga' import { buildSchema } from '@woooow/drizzle-graphql' // Schema contains 'Users' and 'Customers' tables import { db } from './database' const { entities } = buildSchema(db) // You can customize which parts of queries or mutations you want const schema = new GraphQLSchema({ query: new GraphQLObjectType({ name: 'Query', fields: { // Select only wanted queries out of all generated users: entities.queries.users, customer: entities.queries.customersSingle, // Create a custom one customUsers: { // You can reuse and customize types from original schema type: new GraphQLList(new GraphQLNonNull(entities.types.UsersItem)), args: { // You can reuse inputs as well where: { type: entities.inputs.UsersFilters } }, resolve: async (source, args, context, info) => { // Your custom logic goes here... const result = await db.select(schema.Users).where()... return result } } } }), // Same rules apply to mutations mutation: new GraphQLObjectType({ name: 'Mutation', fields: entities.mutations }), // In case you need types inside your schema types: [...Object.values(entities.types), ...Object.values(entities.inputs)] }) const yoga = createYoga({ schema }) server.listen(4000, () => { console.info('Server is running on http://localhost:4000/graphql') })
This project builds upon the excellent work from multiple sources:
- drizzle-team/drizzle-graphql - The original implementation that served as the foundation for this project
- TimMensch/drizzle-graphql - Significant portions of code and improvements were adapted from this fork