@ssense/mysql
v1.0.4
Published
Helpers for accessing and sending queries to MySQL or MariaDB
Downloads
283
Readme
MySQL Client
class Connection
Connection is a helper that makes it easy to access and send queries to a MySQL or MariaDB server. (see examples here)
Methods
| Method | Returns | Description |
| ------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| constructor(options: ConnectionOptions) | Connection | Creates a new instance of Connection |
| query(sql: string, params?: any[]) | Promise<any> | Sends a query to MySQL server and return a result |
| runInTransaction(callback: TransactionFunction) | Promise<any> | Executes a list of statements in a MySQL transactional way, managing the transaction (begin, commit, rollback) automatically |
| runWithLockTables(locks: LockTableOption[], callback: TransactionFunction) | Promise<any> | Same as runInTransaction() method, except it explicitly locks tables before running the transaction (calling LOCK TABLES instead of START TRANSACTION) |
| close() | Promise<void> | Closes all opened connections to the database and prevent new connections to be created |
Details
constructor(options: ConnectionOptions)
Creates a new instance of Connection
Parameters
| Name | Type | Required | Description |
| ------- | ------------------- | :------: | -------------------------------------------------- |
| options | ConnectionOptions | Yes | The parameters used to connect to the MySQL server |
ConnectionOptions properties
See here for more detail about options properties.
| Name | Type | Required | Description |
| --------------- | -------- | :------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| host | string | Yes | MySQL server hostname or IP address |
| database | string | Yes | Name of database to use |
| port | number | No | MySQL port (default: 3306) |
| user | string | No | MySQL username (default: null) |
| password | string | No | MySQL password (default: null) |
| connectionLimit | number | No | Maximum number of parallel connections in internal MySQL connection pool (default: 10) |
| timezone | string | No | The timezone configured on the MySQL server. This is used to type cast server date/time values to JavaScript Date object and vice versa. (default: 'local') |
query(sql: string, params?: any[])
Sends a query to MySQL server and return a result
Parameters
| Name | Type | Required | Description |
| ------ | -------- | :------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| sql | string | Yes | SQL query |
| params | any[] | No | SQL query params for a query with parameters (will be protected against SQL injections, see mysql npm module for more detail) |
Return value
| Type | Description |
| -------------- | ---------------------------- |
| Promise<any> | Result of the executed query |
runInTransaction(callback: TransactionFunction)
Executes a list of statements in a MySQL transactional way, managing the transaction (begin, commit, rollback) automatically
Parameters
| Name | Type | Required | Description |
| -------- | --------------------- | :------: | ----------------------------------------------------------------------------------------------- |
| callback | TransactionFunction | Yes | Function in which all the MySQL statements can be executed (will be run in a MySQL transaction) |
TransactionFunction definition
TransactionFunction is a callback function that will be called with a transaction parameter, this transaction exposes a query function, which has the exact same profile as the query function above.
You are therefore able to call transaction.query() to send MySQL queries in a transactional context. See examples for more detail.
Return value
| Type | Description |
| -------------- | ---------------------------------- |
| Promise<any> | Result of the executed transaction |
runWithLockTables(locks: LockTableOption[], callback: TransactionFunction)
Same as runInTransaction() method, except it explicitly locks tables before running the transaction (calling LOCK TABLES instead of START TRANSACTION)
Parameters
| Name | Type | Required | Description |
| -------- | --------------------- | :------: | ----------------------------------------------------------------------------------------------- |
| locks | LockTableOption[] | Yes | Array of LockTableOption (tables to lock with lock mode) |
| callback | TransactionFunction | Yes | Function in which all the MySQL statements can be executed (will be run in a MySQL transaction) |
LockTableOption properties
| Name | Type | Required | Description |
| ---- | ------------------- | :------: | ------------------------------------------------------ |
| name | string | Yes | Name of the table to lock |
| mode | 'READ'|'WRITE' | Yes | Lock mode to use, must be one of 'READ' or 'WRITE' |
TransactionFunction definition
Definition for TransactionFunction is available in runInTransaction() method above. See examples for more detail.
Return value
| Type | Description |
| -------------- | ---------------------------------- |
| Promise<any> | Result of the executed transaction |
close()
Closes all opened connections to the database and prevent new connections to be created
Examples
Transactional queries using runInTransaction()
import { Connection } from '@ssense/framework';
// Create connection
const connection = new Connection({ ...params });
// Run multiple MySQL commands inside a managed transaction
const result = await connection.runInTransaction(async (transaction) => {
const users = await transaction.query('SELECT * FROM USERS');
if (users.length > 0) {
await transaction.query('UPDATE users set name=.....');
}
return users[0];
});
// result will be the object returned by the runInTransaction() method, here users[0]
// All the MySQL transaction commands (BEGIN, COMMIT or ROLLBACK) are automatically performed, so you just have to focus on your business case.Transactional queries using runWithLockTables()
import { Connection } from '@ssense/framework';
// Create connection
const connection = new Connection({ ...params });
// Run multiple MySQL commands inside a managed transaction
const result = await connection.runWithLockTables(
[
{ name: 'users', mode: 'WRITE' },
{ name: 'accounts', mode: 'WRITE' },
],
async (transaction) => {
// When reaching this part of the code, both "users" and "accounts" tables will be locked, even if we don't perfom any query on the "accounts" table
const users = await transaction.query('SELECT * FROM USERS');
if (users.length > 0) {
await transaction.query('UPDATE users set name=.....');
}
return users[0];
},
);
// result will be the object returned by the runWithLockTables() method, here users[0]
// All the MySQL transaction commands (BEGIN, COMMIT or ROLLBACK) are automatically performed, so you just have to focus on your business case.