Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/caitken-com/simplesqlbuilder


https://github.com/caitken-com/simplesqlbuilder

Last synced: 22 days ago
JSON representation

Awesome Lists containing this project

README

        

# Simple SQL Builder

Generates query strings ready for execution, with built-in parameter escaping & quoting, and helpful clause builder.

## Public methods

- select
- insert
- delete
- update
- joins
- order
- group
- where
- having
- limit
- params
- fromJson
- build

### select

Takes an *{object}* with the following keys:

| param | type | comment |
|---|---|---|
| table | *{string/object}* | `'table_name'` / `{'table_name': 'alias'}` ^ |
| columns | *{string[]}* | List of columns to fetch |
| query | *{object}* | [optional] Pre-built inner query. ^`table` isn't required with this option. `{'alias': 'pre-built query'}` |

Returns self, chainable.

```js
// Simple query example
let query = new SimpleSqlBuilder()
.select({
'table': {'users': 'user'},
'columns': [
'user.first_name',
'user.last_name',
'YEAR(user.date_added) AS alumni'
]
})
.build();

/** Output:
SELECT `user`.`first_name`, `user`.`last_name`, YEAR(`user`.`date_added`) AS `alumni`
FROM `users` AS `user`
*/
---

// Inner query example
let inner = new SimpleSqlBuilder()
.select({
'table': {'orders': 't'},
'columns': [
'MAX(t.date_added) AS date_added',
]
})
.where([
['t.type', '=', '?'],
])
.group([
't.type',
])
.params([
'Fish',
])
.build();

// Main/outer query
let query = new SimpleSqlBuilder()
.select({
'query': {'joiner': inner},
'columns': [
'order.*',
]
})
.joins([
{
'type': 'inner',
'table': { 'orders': 'order' },
'using': [
'date_added'
]
}
])
.where([
['order.type', '=', '?'],
])
.group([
'order.type'
])
.params([
'Fish'
])
.build();

/* Output:
SELECT `order`.*
FROM (
SELECT MAX(`t`.`date_added`) AS `date_added`
FROM `orders` AS `t`
WHERE `t`.`type` = 'Fish'
GROUP BY `t`.`type`
) AS `joiner`
INNER JOIN `orders` AS `order` USING (`date_added`)
WHERE `order`.`type` = 'Fish'
GROUP BY `order`.`type`
*/
```

### insert

Takes an *{object}* with the following keys:

| param | type | comment |
|---|---|---|
| table | *{string}* | `'table_name'` |
| columns | *{object}* | `{column: value}` pairs |
| duplicates | *{string}* | [optional] Update clause on duplicate. **Caution: string not escaped** |

Returns self, chainable.

```js
let query = new SimpleSqlBuilder()
.insert({
'table': 'users',
'columns': {
'first_name', '?',
'last_name', '?',
'age': '?'
},
'duplicates': 'age = age + 1'
})
.params([
'John',
'Doe',
30
]);
```

### delete

Takes an *{object}* with the following keys:

| param | type | comment |
|---|---|---|
| table | *{string/object}* | `'table_name'` / `{'table_name': 'alias'}` |

Returns self, chainable.

```js
let query = new SimpleSqlBuilder()
.delete({
'table': {'users': 'user'}
})
.where([
['user.id','=','?'],
])
.params([
47,
]);
```

### update

Takes an *{object}* with the following keys:

| param | type | comment |
|---|---|---|
| table | *{string/object}* | `'table_name'` / `{'table_name': 'alias'}` |
| columns | *{object}* | `{column: value}` pairs |

Returns self, chainable.

```js
let query = new SimpleSqlBuilder()
.update({
'table': {'users': 'user'},
'columns': {
'age': '?'
}
})
.where([
['user.id','=','?'],
])
.params([
47,
30,
]);
```

### joins

Takes an *{object[]}* with the following keys:

| param | type | comment |
|---|---|---|
| type | *{string}* | `inner` / `outer` / `left` / `right` / `cross` |
| table | *{string/object}* | `'table_name'` / `{'table_name': 'alias'}` |
| conditions | *{array}* | @see `where` for more information ^ |
| using | *{string[]}* | [Optional] List of columns from inner query. ^`conditions` not required with this option. |

Returns self, chainable.

```js
let query = new SimpleSqlBuilder()
.select({
'table': {'users': 'user'},
'columns': ['user.*']
})
.joins([
{
'type': 'left',
'table': {'orders': 'order'},
'conditions': [
['order.user_id', '=', 'user.id']
]
},
// Repeat for each join...
]);
```

### order

Takes an *{array}* of `strings` or `objects`:

| type | comment |
|---|---|
| *{string[] / object[]}* | `'alias.column'` / `{'alias.column': 'asc' / 'desc'}` |

Returns self, chainable.

```js
let query = new SimpleSqlBuilder()
.order([
'user.id',
{'user.first_name': 'desc'},
]);
```

### group

Takes an *{array}* of `strings`:

| type | comment |
|---|---|
| *{string[]}* | `'alias.column'` |

Returns self, chainable.

```js
let query = new SimpleSqlBuilder()
.group([
'user.age',
'user.last_name',
]);
```

### where

Takes an *{array}* of any of the following conditions:

| type | comment |
|---|---|
| *{array}* | `[column, operator, value]` See below for all operators. |
| *{object}* | `{or / and: []}` Closure with keyword of `or` or `and` to combine array of conditions. |
| *{string}* | Allows for advanced SQL functions. **Caution: string not escaped.** |

Returns self, chainable.

```js
let query = new SimpleSqlBuilder()
.where([
['user.active', '=', true],
{
'or': [
['user.first_name', '=', '?'],
['user.last_name', '=', '?'],
]
},
])
.params([
'John',
'Doe'
]);

// Output: WHERE `user`.`active` = 1 AND (`user`.`first_name` = 'John' OR `user`.`last_name` = 'Doe')
```

#### Operators:

- `=` Equals. `['user.age', '=', '?']`.
- `<=` Less than or equals. `['user.age', '<=', '?']`.
- `>=` More than or equals. `['user.age', '>=', '?']`.
- `<` Less than. `['user.age', '<', '?']`.
- `>` More than. `['user.age', '>', '?']`.
- `!=` Not equal. `['user.age', '!=', '?']`.
- `<>` Not equal. `['user.age', '<>', '?']`.
- `is` _Typically used with value of_ `null`. `['user.age', 'is', null]`.
- `is not` _Typically used with value of_ `null`. `['user.age', 'is not', null]`.
- `between` Value must be an _array_ of `["start", "end"]` values. `['user.age', 'between', ['?','?']]`.
- `in` Value must be an _{array}_ `['user.age', 'in', ['?','?','?']]`.
- `not in` Value must be an _{array}_ `['user.age', 'not in', ['?','?','?']]`.
- `contains` Performs a `LIKE` condition in which column value _contains_ given value `value`. `['user.age', 'contains', '?']`.
- `begins` Performs a `LIKE` condition in which the column value _starts_ with given `value`. `['user.age', 'beings', '?']`.
- `ends` Performs a `LIKE` conditions in which the column value _ends_ with given `value`. `['user.age', 'ends', '?']`.

### having

Takes an *{array}* of conditions. @see `where` for more information.

Returns self, chainable.

### limit

Takes either a *{number} / {array}*: `10` / `[offset, limit]`

Returns self, chainable.

```js
// Limit
let query = new SimpleSqlBuilder()
.limit(10);

---

// Offset, limit
let query = new SimpleSqlBuilder()
.limit([100, 15]);
```

### params

Takes either *{array}* of values, or *{object}* of `key:value` pairs.

Returns self, chainable.

```js
// Numeric array of params
let query = new SimpleSqlBuilder()
.where([
['user.first_name', '=', '?'],
['user.age', '=', '?'],
['user.nickname', '=', '?'],
])
.params([
'John',
30,
'John',
]);

---

// Placeholder key-value params
let query = new SimpleSqlBuilder()
.where([
['user.first_name', '=', '?:name'],
['user.age', '=', '?:age'],
['user.nickname', '=', '?:name'],
])
.params({
'name': 'John',
'age': 30
});
```

### fromJson

Static method takes *{JSON}* with any of the *above public methods* as keys and returns the output of the `build` method.

Returns *{string}* The completed SQL statement.

```js
let query = SimpleSqlBuilder.fromJson({
'select': {
'table': {'users': 'user'},
'columns': ['user.*']
},
'where': [
['user.first_name', '=', '?'],
],
'params': [
'John'
],
'limit': 10
});

console.log(query);

// Output: SELECT `user`.* FROM `users` AS `user` WHERE `user`.`first_name` = 'John' LIMIT 10
```

### build

Returns *{string}* The completed SQL statement.

```js
let query = new SimpleSqlBuilder()
.select({
'table': {'users': 'user'},
'columns': ['user.*']
})
.where([
['user.first_name', '=', '?'],
])
.limit(10)
.params([
'John',
])
.build();

console.log(query);

// Output: SELECT `user`.* FROM `users` AS `user` WHERE `user`.`first_name` = 'John' LIMIT 10
```