Using MySQL2 with TypeScript
Installationโ
npm install --save mysql2
npm install --save-dev @types/node
The
@types/node
ensure the proper interaction between TypeScript and the Node.js modules used by MySQL2 (net, events, stream, tls, etc.).
Requires TypeScript >=4.5.2
.
Usageโ
You can import MySQL2 in two ways:
- By setting the
esModuleInterop
option totrue
intsconfig.json
import mysql from 'mysql2';
import mysql from 'mysql2/promise';
- By setting the
esModuleInterop
option tofalse
intsconfig.json
import * as mysql from 'mysql2';
import * as mysql from 'mysql2/promise';
Connectionโ
import mysql, { ConnectionOptions } from 'mysql2';
const access: ConnectionOptions = {
user: 'test',
database: 'test',
};
const conn = mysql.createConnection(access);
Pool Connectionโ
import mysql, { PoolOptions } from 'mysql2';
const access: PoolOptions = {
user: 'test',
database: 'test',
};
const conn = mysql.createPool(access);
Query and Executeโ
A simple queryโ
conn.query('SELECT 1 + 1 AS `test`;', (_err, rows) => {
/**
* @rows: [ { test: 2 } ]
*/
});
conn.execute('SELECT 1 + 1 AS `test`;', (_err, rows) => {
/**
* @rows: [ { test: 2 } ]
*/
});
The rows
output will be these possible types:
RowDataPacket[]
RowDataPacket[][]
ResultSetHeader
ResultSetHeader[]
ProcedureCallPacket
In this example, you need to manually check the output types
Type Specificationโ
RowDataPacket[]โ
An array with the returned rows, for example:
import mysql, { RowDataPacket } from 'mysql2';
const conn = mysql.createConnection({
user: 'test',
database: 'test',
});
// SELECT
conn.query<RowDataPacket[]>('SELECT 1 + 1 AS `test`;', (_err, rows) => {
console.log(rows);
/**
* @rows: [ { test: 2 } ]
*/
});
// SHOW
conn.query<RowDataPacket[]>('SHOW TABLES FROM `test`;', (_err, rows) => {
console.log(rows);
/**
* @rows: [ { Tables_in_test: 'test' } ]
*/
});
Using rowsAsArray
option as true
:
import mysql, { RowDataPacket } from 'mysql2';
const conn = mysql.createConnection({
user: 'test',
database: 'test',
rowsAsArray: true,
});
// SELECT
conn.query<RowDataPacket[]>(
'SELECT 1 + 1 AS test, 2 + 2 AS test;',
(_err, rows) => {
console.log(rows);
/**
* @rows: [ [ 2, 4 ] ]
*/
}
);
// SHOW
conn.query<RowDataPacket[]>('SHOW TABLES FROM `test`;', (_err, rows) => {
console.log(rows);
/**
* @rows: [ [ 'test' ] ]
*/
});
RowDataPacket[][]โ
Using multipleStatements
option as true
with multiple queries:
import mysql, { RowDataPacket } from 'mysql2';
const conn = mysql.createConnection({
user: 'test',
database: 'test',
multipleStatements: true,
});
const sql = `
SELECT 1 + 1 AS test;
SELECT 2 + 2 AS test;
`;
conn.query<RowDataPacket[][]>(sql, (_err, rows) => {
console.log(rows);
/**
* @rows: [ [ { test: 2 } ], [ { test: 4 } ] ]
*/
});
ResultSetHeaderโ
History
Version | Changes |
---|---|
v3.5.1 | Please use ResultSetHeader instead. Please use affectedRows instead. |
For INSERT
, UPDATE
, DELETE
, TRUNCATE
, etc.:
import mysql, { ResultSetHeader } from 'mysql2';
const conn = mysql.createConnection({
user: 'test',
database: 'test',
});
const sql = `
SET @1 = 1;
`;
conn.query<ResultSetHeader>(sql, (_err, result) => {
console.log(result);
/**
* @result: ResultSetHeader {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
info: '',
serverStatus: 2,
warningStatus: 0,
changedRows: 0
}
*/
});
ResultSetHeader[]โ
History
Version | Changes |
---|---|
v3.5.1 |
For multiples INSERT
, UPDATE
, DELETE
, TRUNCATE
, etc. when using multipleStatements
as true
:
import mysql, { ResultSetHeader } from 'mysql2';
const conn = mysql.createConnection({
user: 'test',
database: 'test',
multipleStatements: true,
});
const sql = `
SET @1 = 1;
SET @2 = 2;
`;
conn.query<ResultSetHeader[]>(sql, (_err, results) => {
console.log(results);
/**
* @results: [
ResultSetHeader {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
info: '',
serverStatus: 10,
warningStatus: 0,
changedRows: 0
},
ResultSetHeader {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
info: '',
serverStatus: 2,
warningStatus: 0,
changedRows: 0
}
]
*/
});
ProcedureCallPacketโ
History
Version | Changes |
---|---|
v3.5.1 |
By performing a Call Procedure using INSERT
, UPDATE
, etc., the return will be a ProcedureCallPacket<ResultSetHeader>
(even if you perform multiples queries and set multipleStatements
to true
):
import mysql, { ProcedureCallPacket, ResultSetHeader } from 'mysql2';
const conn = mysql.createConnection({
user: 'test',
database: 'test',
});
/** ResultSetHeader */
conn.query('DROP PROCEDURE IF EXISTS myProcedure');
/** ResultSetHeader */
conn.query(`
CREATE PROCEDURE myProcedure()
BEGIN
SET @1 = 1;
SET @2 = 2;
END
`);
/** ProcedureCallPacket */
const sql = 'CALL myProcedure()';
conn.query<ProcedureCallPacket<ResultSetHeader>>(sql, (_err, result) => {
console.log(result);
/**
* @result: ResultSetHeader {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
info: '',
serverStatus: 2,
warningStatus: 0,
changedRows: 0
}
*/
});
For
CREATE PROCEDURE
andDROP PROCEDURE
, these returns will be the defaultResultSetHeader
.
By using SELECT
and SHOW
queries in a Procedure Call, it groups the results as:
/** ProcedureCallPacket<RowDataPacket[]> */
[RowDataPacket[], ResultSetHeader]
For ProcedureCallPacket<RowDataPacket[]>
, please see the following examples.
OkPacketโ
OkPacket is deprecated and might be removed in the future major release.
Please use ResultSetHeader instead.
Examplesโ
You can also check some code examples using MySQL2 and TypeScript to understand advanced concepts:
- Extending and using Interfaces with
RowDataPacket
- Extending and using Interfaces with
RowDataPacket
androwAsArray
- Extending and using Interfaces with
RowDataPacket
andmultipleStatements
- Extending and using Interfaces with
RowDataPacket
,rowAsArray
andmultipleStatements
- Checking for
ResultSetHeader
, extending and using Interfaces withRowDataPacket
fromProcedureCallPacket
- Checking for
ResultSetHeader
, extending and using Interfaces withRowDataPacket
androwAsArray
fromProcedureCallPacket
- Creating a basic custom MySQL2 Class