Miss any of our Open RFC calls?Watch the recordings here! »

graphql-knex-resolver

0.0.0 • Public • Published

graphql-knex-resolver

NPM version Build status Dependency Status Code Climate

GraphQL Resolver built with Knex. Can be used to parse GraphQL ASTs into SQL, and as a resolver method standin in a GraphQL schema. Supports whichever databases are supported by Knex.

Install

$ npm install --save graphql-knex-resolver

Usage

Do the stuff you'd normally do, but use the provided resolver method in your GraphQL schema.

1. Initialize the Resolver

const Resolver = require('graphql-knex-resolver')
 
// setup knex
const gql = require('graphql')
const knex = require('knex')({
  client: 'pg',
  connection: {
    // ...
  }
})
const resolver = Resolver.getResolver(knex)

2. Define the Schema

// create the GraphQL schema using the resolver
const userObject = new gql.GraphQLObjectType({
  name: 'User',
  fields: () => ({
    username: {
      type: gql.GraphQLString
    }
  })
})
const userQuery = new gql.GraphQLObjectType({
  name: 'UserQuery',
  fields: () => ({
    user: {
      type: userObject,
      resolve: resolver // <-------- use the resolver method
    }
  })
})
const userSchema = new gql.GraphQLSchema({
  query: userQuery
})

3. Execute a Query

const findUserByUsername = `{
  user (username: $username) {
    id
    username
  }
}`
return gql.graphql(userSchema, findUserByUsername, {
    username: "tjwebb"
  })
  .then(results => {
    console.log(results)
    // results = {
    //   data: {
    //     user: {
    //       username: 'tjwebb'
    //     }
    //   }
    // }
  })

API

getResolver(engine)

Prepare a new GraphQL Query Resolver

.toSQL(query, dialect, args)

Translates a GraphQL query into SQL, irrespective of schema. Uses the root field name as the table.

dialect is one of (docs):

  • pg
  • mysql
  • sqlite3
  • oracle
  • mariasql

Example

Using the findUserByUsername query above:

Simple Select Statement
const sql = resolver.toSQL(findUserByUsername, 'pg', {
  username: 'tjwebb'
})
// sql = select "username", from "user" where "name" = 'tjwebb'
Select Where In List Statement
const sql = resolver.toSQL(queries.parameterizedWithListType, 'pg', {
  username: [ 'tjwebb', 'admin' ]
})
// sql = select "username" from "user" where "name" = ANY ('{"tjwebb","admin"}')

Table name is inferred to be user since the root field is user. The following query would use the table name "foo":

const findUserByUsername = `{
  foo (username: $username) {
    id
    username
  }
}`

Install

npm i graphql-knex-resolver

DownloadsWeekly Downloads

11

Version

0.0.0

License

MIT

Last publish

Collaborators

  • avatar