graphql-compose-mysql v0.0.7
graphql-compose-mysql
Generates GraphQL types and resolvers from a MySQL database.
As cherry on the cake, it will also:
- Create fields to make joins between tables (based on foreign keys detected)
 - Use Facebook's dataloader under the hood to drastically improve querying performance*
 
*: To avoid incoherent data, dataloaders' caching disabled, only batching feature used.
Installation
yarn install graphql graphql-compose graphql-compose-mysqlModules graphql and graphql-compose, are located in peerDependencies, so they should be installed explicitly in your app. They have global objects and should not have ability to be installed as submodules.
Sample usage
const { ApolloServer } = require("apollo-server")
const { composeWithMysql } = require("graphql-compose-mysql")
async function main() {
    return composeWithMysql({
        mysqlConfig: {
            host: "localhost",
            port: 3306,
            user: "root",
            password: "secret",
            database: "employees"
        },
    }).then(schema => {
        const server = new ApolloServer({
            schema: schema,
            playground: true,
        })
        server.listen().then(({ url }) => {
            console.log(`🚀 Server ready at ${url}`)
        })
    })
}
main()mysqlConfig will be used internally to initialize a mysql driver. See Available options here.
Tests
pre-requisites
Start the needed docker containers by issuing a docker-compose up in the /tests/ folder.
It will spin up a MySQL database exposed on the local port 3306 and load it up with employees data from datacharmer/test_db.
You will also get an adminer GUI on the local port 8080.
MySQL employees' database

GraphQL schema generated
As you can see, join's fields between tables are also created.
      type current_dept_empT {
        emp_no: Int
        dept_no: String
        from_date: Date
        to_date: Date
      }
      
      scalar Date
      
      type departmentsT {
        dept_no: String
        dept_name: String
      }
      
      type dept_emp_latest_dateT {
        emp_no: Int
        from_date: Date
        to_date: Date
      }
      
      type dept_empT {
        emp_no: Int
        dept_no: String
        from_date: Date
        to_date: Date
        departments(dept_name: String): [departmentsT]
        employees(birth_date: Date, first_name: String, last_name: String, gender: String, hire_date: Date): [employeesT]
      }
      
      type dept_managerT {
        emp_no: Int
        dept_no: String
        from_date: Date
        to_date: Date
        departments(dept_name: String): [departmentsT]
        employees(birth_date: Date, first_name: String, last_name: String, gender: String, hire_date: Date): [employeesT]
      }
      
      type employeesT {
        emp_no: Int
        birth_date: Date
        first_name: String
        last_name: String
        gender: String
        hire_date: Date
      }
      
      type Query {
        current_dept_emp(emp_no: Int, dept_no: String, from_date: Date, to_date: Date): [current_dept_empT]
        departments(dept_no: String, dept_name: String): [departmentsT]
        dept_emp(emp_no: Int, dept_no: String, from_date: Date, to_date: Date): [dept_empT]
        dept_emp_latest_date(emp_no: Int, from_date: Date, to_date: Date): [dept_emp_latest_dateT]
        dept_manager(emp_no: Int, dept_no: String, from_date: Date, to_date: Date): [dept_managerT]
        employees(emp_no: Int, birth_date: Date, first_name: String, last_name: String, gender: String, hire_date: Date): [employeesT]
        salaries(emp_no: Int, salary: Int, from_date: Date, to_date: Date): [salariesT]
        titles(emp_no: Int, title: String, from_date: Date, to_date: Date): [titlesT]
      }
      
      type salariesT {
        emp_no: Int
        salary: Int
        from_date: Date
        to_date: Date
        employees(birth_date: Date, first_name: String, last_name: String, gender: String, hire_date: Date): [employeesT]
      }
      
      type titlesT {
        emp_no: Int
        title: String
        from_date: Date
        to_date: Date
        employees(birth_date: Date, first_name: String, last_name: String, gender: String, hire_date: Date): [employeesT]
      }Run tests
After docker's containers are started, in root folder run:
yarn test