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.
yarn install graphql graphql-compose graphql-compose-mysql
Modules 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.
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.
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.
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] }
After docker's containers are started, in root folder run:
yarn test