---
title: 'GraphQL APIs'
position: 1020
category: 'Developer Resources'
menuTitle: 'GraphQL APIs'
---

<announcement></announcement>

## Features

* Generates GraphQL APIs for **ANY** MySql, Postgres, MSSQL, Sqlite database :fire:
* Serves GraphQL queries irrespective of naming conventions of primary keys, foreign keys, tables etc :fire:
* Support for composite primary keys :fire:
* Usual suspects : CRUD, List, FindOne, Count, Exists, Distinct
* Pagination 
* Sorting
* Column filtering - Fields :fire:  
* Row filtering - Where :fire:
* Bulk insert, Bulk delete, Bulk read :fire:   
* Relations - automatically detected
* Aggregate functions
* More
    * Upload single file
    * Upload multiple files
    * Download file
* Authentication
* Access Control


## API Overview

### Query

|  **Resolver**  |   **Arguments** | **Returns** | **Description**  |
|---|---|---|---|
| [TableName**List**](#tablenamelist) | where: String, limit: Int, offset: Int, sort: String | [TableName] | List of table rows |
| [TableName**Read**](#tablenameread) | id:String |  TableName | Get row by primary key |
| [TableName**Exists**](#tablenameexists) | id: String | Boolean | Check row exists by primary key |
| [TableName**FindOne**](#tablenamefindone) | where: String | TableName | Find row by where conditions |
| [TableName**Count**](#tablenamecount) | where: String | Int | Get rows count |
| [TableName**Distinct**](#tablenamedistinct) | columnName: String, where: String, limit: Int, offset: Int, sort: String | [TableName] | Get distinct rows based on provided column names |
| [TableName**GroupBy**](#tablenamegroupby) | fields: String, having: String, limit: Int, offset: Int, sort: String | [TableNameGroupBy] | Group rows by provided columns |
| [TableName**Aggregate**](#tablenameaggregate) | columnName: String!, having: String, limit: Int, offset: Int, sort: String, func: String! | [TableNameAggregate] | Do aggregation based on provided column name aggregate function |
| [TableName**Distribution**](#tablenamedistribution) | min: Int, max: Int, step: Int, steps: String, columnName: String! | [distribution] | Get distributed list |
	

### Mutations

|  **Resolver**  |   **Arguments** | **Returns** | **Description**  |
|---|---|---|---|
| [TableName**Create**](#tablenamecreate) | data:TableNameInput | TableName | Insert row into table |
| [TableName**Update**](#tablenameupdate) | id:String,data:TableNameInput | TableName | Update table row using primary key |
| [TableName**Delete**](#tablenamedelete) | id:String | TableName |  Delete table row using primary id |
| [TableName**CreateBulk**](#tabelenamecreatebulk) | data: [TableNameInput] | [Int] | Bulk row insert |
| [TableName**UpdateBulk**](#tablenamebulk) | data: [TableNameInput] | [Int] | Bulk row update |
| [TableName**DeleteBulk**](#tablenamedeletebulk) | data: [TableNameInput] | [Int] | Bulk row delete  |

### Query params

|  **Param**  | **Description** | **Default value**  |**Example Value**|
|---|---|---|---|
|  where  | Logical Expression | | `(colName,eq,colValue)~or(colName2,gt,colValue2)` <br />[Usage: Comparison operators](#comparison-operators) <br />[Usage: Logical operators](#logical-operators) |
|  limit  |  Number of rows to get(SQL limit value)  | 10  | 20 |
|  offset |  Offset for pagination(SQL offset value)  | 0  | 20 |
|  sort  |  Sort column name, where use `-` as prefix for descending sort  |   | column_name |
|  fields |  Required column names in result  |  * | column_name_1,column_name_2 |

#### Comparison operators

```
eq      -   '='         -  (colName,eq,colValue)
not     -   '!='        -  (colName,not,colValue)
gt      -   '>'         -  (colName,gt,colValue)
ge      -   '>='        -  (colName,ge,colValue)
lt      -   '<'         -  (colName,lt,colValue)
le      -   '<='        -  (colName,le,colValue)
is      -   'is'        -  (colName,is,true/false/null)
isnot   -   'is not'    -  (colName,isnot,true/false/null)
in      -   'in'        -  (colName,in,val1,val2,val3,val4)
btw     -   'between'   -  (colName,btw,val1,val2) 
nbtw    -  'not between'-  (colName,nbtw,val1,val2) 
like    -   'like'      -  (colName,like,%name)
```

#### Example use of comparison operators - complex example
```
PaymentList(where:"(checkNumber,eq,JM555205)~or((amount,gt,200)~and(amount,lt,2000))") 
```

#### Logical operators

```
~or     -   'or'
~and    -   'and'
~not    -   'not'
```

## Examples

### TableNameList

<code-group>
  <code-block label="Request" active> 
  
```
CountryList {
    country_id
    country
    last_update
}
```  
</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryList": [
      {
        "country_id": 1,
        "country": "Afghanistan",
        "last_update": "1139978640000",
        "CityCount": 1
      },
      {
        "country_id": 2,
        "country": "Algeria",
        "last_update": "1139978640000",
        "CityCount": 3
      },
      {
        "country_id": 3,
        "country": "American Samoa",
        "last_update": "1139978640000",
        "CityCount": 1
      }
    ]
  }
}
```

  </code-block> 
</code-group>


#### List + where  
<code-group>
  <code-block label="Request" active> 
  
```
{
  CountryList(where:"(country,like,United%)") {
    country_id
    country
    last_update
    CityCount
  }
}
``` 


</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryList": [
      {
        "country_id": 101,
        "country": "United Arab Emirates",
        "last_update": "1139958840000",
        "CityCount": 3
      },
      {
        "country_id": 102,
        "country": "United Kingdom",
        "last_update": "1139958840000",
        "CityCount": 8
      },
      {
        "country_id": 103,
        "country": "United States",
        "last_update": "1139958840000",
        "CityCount": 35
      }
    ]
  }
}
```
  </code-block> 
</code-group>


[Usage : comparison operators](#comparison-operators)





#### List + where + sort
<code-group>
  <code-block label="Request" active> 
  
```
{
  CountryList(where:"(country,like,United%)",sort:"-country") {
    country_id
    country
    last_update
    CityCount
  }
}
``` 

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryList": [
      {
        "country_id": 103,
        "country": "United States",
        "last_update": "1139958840000",
        "CityCount": 35
      },
      {
        "country_id": 102,
        "country": "United Kingdom",
        "last_update": "1139958840000",
        "CityCount": 8
      },
      {
        "country_id": 101,
        "country": "United Arab Emirates",
        "last_update": "1139958840000",
        "CityCount": 3
      }
    ]
  }
}
```
  </code-block> 
</code-group>


#### List + where + sort + offset
<code-group>
  <code-block label="Request" active> 
  
```
{
  CountryList(where:"(country,like,United%)",sort:"-country",offset:1) {
    country_id
    country
    last_update
    CityCount
  }
}
``` 

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryList": [
      {
        "country_id": 102,
        "country": "United Kingdom",
        "last_update": "1139958840000",
        "CityCount": 8
      },
      {
        "country_id": 101,
        "country": "United Arab Emirates",
        "last_update": "1139958840000",
        "CityCount": 3
      }
    ]
  }
}
```
  </code-block> 
</code-group>




#### List + limit

<code-group>
  <code-block label="Request" active> 
  
```
{
  CountryList(limit:6) {
    country
  }
}
``` 

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryList": [
      {
        "country": "Afghanistan"
      },
      {
        "country": "Algeria"
      },
      {
        "country": "American Samoa"
      },
      {
        "country": "Angola"
      },
      {
        "country": "Anguilla"
      },
      {
        "country": "Argentina"
      }
    ]
  }
}
```
  </code-block> 
</code-group>






[⤴](#query)

### TableNameRead
<code-group>
  <code-block label="Request" active> 
  
```
 CountryRead(id:"1") {
   country_id
   country
   last_update
 }
```

</code-block>
<code-block label="Response">

```json
  "data": {
    "CountryRead": {
      "country_id": 1,
      "country": "Afghanistan",
      "last_update": "1139978640000",
      "CityCount": 1
    }
  }
```
  </code-block> 
</code-group>


[⤴](#query)

### TableNameExists
<code-group>
  <code-block label="Request" active> 
  
```
 CountryExists(id:"1")
```

</code-block>
<code-block label="Response">

```json
  "data": {
    "CountryExists": true
  }
```
  </code-block> 
</code-group>


[⤴](#query)

### TableNameFindOne
<code-group>
  <code-block label="Request" active> 
  
```
 CountryFindOne(where:"(country_id,eq,1)") {
   country_id
   country
   last_update
   CityCount
 }
```

</code-block>
<code-block label="Response">

```json
  "data": {
    "CountryFindOne": {
      "country_id": 1,
      "country": "Afghanistan",
      "last_update": "1139978640000",
      "CityCount": 1
    }
  }
```
  </code-block> 
</code-group>


[⤴](#query)

### TableNameCount
<code-group>
  <code-block label="Request" active> 
  
```
CountryCount
```

</code-block>
<code-block label="Response">

```json
{
 "data": {
    "CountryCount": 109
  }
}
```

  </code-block> 
</code-group>


[⤴](#query)

### TableNameDistinct
<code-group>
  <code-block label="Request" active> 
  
```
{
  CountryDistinct(columnName:"last_update",limit:3) {
    last_update
  }
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryDistinct": [
      {
        "last_update": "1139958840000"
      },
      {
        "last_update": "1578323893000"
      },
      {
        "last_update": "1578321201000"
      }
    ]
  }
}
```
  </code-block> 
</code-group>


[⤴](#query)

### TableNameGroupBy
<code-group>
  <code-block label="Request" active> 
  
```
{
  CountryGroupBy(fields:"last_update",limit:1) {
    country_id
    country
    last_update
    count
  }
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryGroupBy": [
      {
        "country_id": null,
        "country": null,
        "last_update": "1139958840000",
        "count": 109
      }
    ]
  }
}
```
  </code-block> 
</code-group>


[⤴](#query)

### TableNameAggregate
<code-group>
  <code-block label="Request" active> 
  
```
{
  PaymentAggregate(columnName:"amount",func:"min,max,avg,count") {
    count
    avg
    min
  }
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "PaymentAggregate": [
      {
        "count": 16048,
        "avg": 4.200743,
        "min": 0
      }
    ]
  }
}
```

[⤴](#query)

### TableNameDistribution
<code-group>
  <code-block label="Request" active> 
  
```
{
  PaymentDistribution (columnName:"amount"){
    range
    count
  }
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "PaymentDistribution": [
      {
        "range": "0-4",
        "count": 8302
      },
      {
        "range": "5-8",
        "count": 3100
      },
      {
        "range": "9-11.99",
        "count": 371
      }
    ]
  }
}
```

  </code-block> 
</code-group>

[⤴](#mutations)

### TableNameCreate
<code-group>
  <code-block label="Request" active> 
  
```
mutation {
  CountryCreate(data: {country: "test"}) {
    country_id
    country
    last_update
    CityCount
  }
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryCreate": {
      "country_id": 10264,
      "country": "test",
      "last_update": null,
      "CityCount": 0
    }
  }
}
```

  </code-block> 
</code-group>

[⤴](#mutations)

### TableNameUpdate
<code-group>
  <code-block label="Request" active> 
  
```
mutation {
  CountryUpdate(data: {country: "test_new"}, id: "10264") {
    country_id
    country
    last_update
    CityCount
  }
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryUpdate": {
      "country_id": null,
      "country": null,
      "last_update": null,
      "CityCount": null
    }
  }
}
```

  </code-block> 
</code-group>

[⤴](#mutations)

### TableNameDelete
<code-group>
  <code-block label="Request" active> 
  
```
mutation {
  CountryDelete(id: "10264") {
    country_id
    country
    last_update
    CityCount
  } 
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryDelete": {
      "country_id": null,
      "country": null,
      "last_update": null,
      "CityCount": null
    }
  }
}
```
  </code-block> 
</code-group>


[⤴](#mutations)

### TableNameCreateBulk
<code-group>
  <code-block label="Request" active> 
  
```
mutation {
  CountryCreateBulk(data:[{country:"test 2"},{country:"test 3"}])
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryCreateBulk": [
      10265
    ]
  }
}
```
  </code-block> 
</code-group>


[⤴](#mutations)

### TableNameUpdateBulk
<code-group>
  <code-block label="Request" active> 
  
```
mutation {
  CountryUpdateBulk(data: [{country: "test 2", country_id: 10265}, {country: "test 3", country_id: 10266}])
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryUpdateBulk": [
      1,
      1
    ]
  }
}
```
  </code-block> 
</code-group>


[⤴](#mutations)

### TableNameDeleteBulk
<code-group>
  <code-block label="Request" active> 
  
```
mutation {
  CountryDeleteBulk(data: [{country_id: 10265}, {country_id: 10266}])
}
```

</code-block>
<code-block label="Response">

```json
{
  "data": {
    "CountryDeleteBulk": [
      1,
      1
    ]
  }
}
```
  </code-block> 
</code-group>