Skip to content

Automatically generate GraphQL schema or customizable schema config fields from Drizzle ORM schema

License

Notifications You must be signed in to change notification settings

drizzle-team/drizzle-graphql

Repository files navigation

Drizzle-GraphQL

Automatically create GraphQL schema or customizable schema config fields from Drizzle ORM schema

Usage

  • Pass your drizzle database instance and schema into builder to generate{ schema, entities }object

  • Useschemaif pre-built schema already satisfies all your neeeds. It's compatible witn any server that consumesGraphQLSchemaclass instance

    Example: hosting schema usingGraphQL Yoga

    import{createServer}from'node:http'
    import{createYoga}from'graphql-yoga'
    import{buildSchema}from'drizzle-graphql'
    
    // db - your drizzle instance
    import{db}from'./database'
    
    const{schema}=buildSchema(db)
    
    constyoga=createYoga({schema})
    
    server.listen(4000,()=>{
    console.info('Server is running on http://localhost:4000/graphql')
    })
  • If you want to customize your schema, you can useentitiesobject to build your own new schema

    import{createServer}from'node:http'
    import{GraphQLList,GraphQLNonNull,GraphQLObjectType,GraphQLSchema}from'graphql'
    import{createYoga}from'graphql-yoga'
    import{buildSchema}from'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
    constschema=newGraphQLSchema({
    query:newGraphQLObjectType({
    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:newGraphQLList(newGraphQLNonNull(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...
    constresult=awaitdb.select(schema.Users).where()...
    
    returnresult
    }
    }
    }
    }),
    // Same rules apply to mutations
    mutation:newGraphQLObjectType({
    name:'Mutation',
    fields:entities.mutations
    }),
    // In case you need types inside your schema
    types:[...Object.values(entities.types),...Object.values(entities.inputs)]
    })
    
    constyoga=createYoga({
    schema
    })
    
    server.listen(4000,()=>{
    console.info('Server is running on http://localhost:4000/graphql')
    })