[![Build Status](https://travis-ci.org/o1lab/xmysql.svg?branch=master)](https://travis-ci.org/o1lab/xmysql) # xmysql: one command to generate REST APIs for **any** MySql database > Requires node >= 7.6.0 ## Why this ? Deriving REST APIs for a database which do not follow conventions of frameworks such as rails, django etc is like a small adventure ..

Rick & Morty

Hence this. Powered by node packages : (express, mysql) => { xmysql } ## Usage * npm install -g xmysql * xmysql -h localhost -u mysqlUsername -p mysqlPassword -d databaseName ## FEATURES * Generates API for **ANY** MySql database * Serves APIs irrespective of naming conventions of primary keys, foreign keys, tables etc * CRUD : Usual suspects * Support for composite primary keys * Pagination * Sorting * Fields * Relations * Run dynamic queries ## Sample usage * npm install -g xmysql * xmysql -h localhost -u mysqlUsername -p mysqlPassword -d databaseName * [http://localhost:3000](#http://localhost:3000) Run HTTP client [Postman](https://www.getpostman.com/) or [similar tools](https://chrome.google.com/webstore/search/http%20client?_category=apps) to invoke REST API calls ## CRUD APIs Usual Suspects * GET       /api/:tableName * POST      /api/:tableName * GET       /api/:tableName/:id * PUT       /api/:tableName/:id * GET       /api/:tableName/count * GET       /api/:tableName/exists * GET       /api/:parentTable/:id/:childTable * DELETE  /api/:tableName/:id * POST     /dynamic ## Other APIS * GET      /api/:tableName/describe * GET      /api/tables ## Support for composite primary keys #### ___ (three underscores) ``` /api/payments/103___JM555205 ``` *___* : If there are multiple primary keys - seperate them by three underscores as shown ## Pagination #### _p & _size _p indicates page and _size indicates size of response rows By default 20 records and max of 100 are returned per GET request on a table. ``` /api/payments?_size=50 ``` ``` /api/payments?_p=2 ``` ``` /api/payments?_p=2&_size=50 ``` ## Sorting #### _sort ``` /api/payments?_sort=column1 ``` eg: sorts ascending by column1 ``` /api/payments?_sort=-column1 ``` eg: sorts descending by column1 ``` /api/payments?_sort=column1,-column2 ``` eg: sorts ascending by column1 and descending by column2 ## Fields ``` /api/payments?_fields=customerNumber,checkNumber ``` eg: gets only customerNumber and checkNumber in response of each record ``` /api/payments?_fields=-checkNumber ``` eg: gets all fields in table row but not checkNumber ## Run dynamic queries Dynamic queries on a database can be run by POST method to URL localhost:3000/dynamic This is enabled only in local i.e -h localhost or -h 127.0.0.1 option. Post body takes two fields : query and params. >query: SQL query or SQL prepared query (ones with ?? and ?) >params : parameters for SQL prepared query ``` POST /dynamic { "query": "select * from ?? limit 1,20", "params": ["customers"] } ``` ## Relational Tables xmysql identifies foreign key relations automatically and provides GET api. ``` /api/customers/103/payments ``` eg: Customers is parent table and payments is child table. API invocation will result in all payments with customer 103. ## When to use ? * You need REST APIs without much hassle for (ANY) MySql database * You are learning new frontend frameworks and need REST APIs for your MySql database. * You are working on a demo, hacks etc ## When NOT to use ? * Other times not mentioned in when to use section