MySQL2
Cliente MySQL para Node.js com foco em performance. Suporta instruções preparadas (prepared statements), Codificações non-utf8, protocolo de log binário (binary log protocol), compressão, SSL e muito mais.
Instalação
O MySQL2 não tem restrições nativas e pode ser instalado no Linux, Mac OS ou Windows sem qualquer problema.
- JavaScript
- TypeScript
npm install --save mysql2
npm install --save mysql2
npm install --save-dev @types/node
Para documentação e exemplos usando TypeScript, veja aqui.
Primeira Consulta (Query)
Para explorar mais exemplos de consulta (queries), visite a seção de exemplos Consultas Simples e Instruções Preparadas (Prepared Statements).
- Promise
- Callback
// Obtém o cliente
import mysql from 'mysql2/promise';
// Cria a conexão com o Banco de Dados
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'test',
});
// Consulta simples
try {
const [results, fields] = await connection.query(
'SELECT * FROM `table` WHERE `name` = "Page" AND `age` > 45'
);
console.log(results); // "results" contêm as linhas retornadas pelo servidor
console.log(fields); // "fields" contêm metadados adicionais sobre os resultados, quando disponíveis
} catch (err) {
console.log(err);
}
// Utilizando espaços reservados (placeholders)
try {
const [results] = await connection.query(
'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
['Page', 45]
);
console.log(results);
} catch (err) {
console.log(err);
}
// Obtém o cliente
const mysql = require('mysql2');
// Cria a conexão com o Banco de Dados
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'test',
});
// Consulta simples
connection.query(
'SELECT * FROM `table` WHERE `name` = "Page" AND `age` > 45',
function (err, results, fields) {
console.log(results); // "results" contêm as linhas retornadas pelo servidor
console.log(fields); // "fields" contêm metadados adicionais sobre os resultados, quando disponíveis
}
);
// Utilizando espaços reservados (placeholders)
connection.query(
'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
['Page', 45],
function (err, results) {
console.log(results);
}
);
Usando Instruções Preparadas (Prepared Statements)
Com o MySQL2 você também pode obter Instruções Preparadas (Prepared Statements). Dessa forma o MySQL não precisa preparar um plano para a mesma consulta todas as vezes, resultando em um melhor desempenho. Se você não sabe por que isso é importante, veja essa discussão:
O MySQL2 fornece o método auxiliar execute
que irá preparar e consultar as declarações (statements) SQL. Além disso, você também pode usar os métodos prepare
e unprepare
para preparar ou desfazer a preparação de declarações (statements) manualmente, se necessário.
Para explorar mais exemplos de Instruções Preparadas (Prepared Statements), visite a seção de exemplos Instruções Preparadas (Prepared Statements).
- Promise
- Callback
import mysql from 'mysql2/promise';
try {
// Cria a conexão com o Banco de Dados
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'test',
});
// "execute" irá chamar internamente a preparação e a consulta (query)
const [results, fields] = await connection.execute(
'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
['Rick C-137', 53]
);
console.log(results); // "results" contêm as linhas retornadas pelo servidor
console.log(fields); // "fields" contêm metadados adicionais sobre os resultados, quando disponíveis
} catch (err) {
console.log(err);
}
const mysql = require('mysql2');
// Cria a conexão com o Banco de Dados
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'test',
});
// "execute" irá chamar internamente a preparação e a consulta (query)
connection.execute(
'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
['Rick C-137', 53],
function (err, results, fields) {
console.log(results); // "results" contêm as linhas retornadas pelo servidor
console.log(fields); // "fields" contêm metadados adicionais sobre os resultados, quando disponíveis
}
);
Se você executar a mesma declaração novamente, ela será selecionada a partir do LRU Cache, o que economizará tempo de preparação da consulta e proporcionará melhor desempenho.
Usando Conjunto de Conexões (pools)
O conjunto de conexões (pools) ajuda a reduzir o tempo gasto na conexão com o servidor MySQL, reutilizando uma conexão anterior e deixando-as abertas ao invés de fechá-las quando você termina de usá-las.
Isto melhora a latência das consultas (queries), pois evita toda a sobrecarga associada à criação de uma nova conexão.
Para explorar mais exemplos de Conjunto de Conexões (pools), visite a seção de exemplos createPool.
- Promise
- Callback
import mysql from 'mysql2/promise';
// Cria a conexão (pool). As definições específicadas do "createPool" são as predefinições padrões
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
database: 'test',
waitForConnections: true,
connectionLimit: 10,
maxIdle: 10, // Máximo de conexões inativas; o valor padrão é o mesmo que "connectionLimit"
idleTimeout: 60000, // Tempo limite das conexões inativas em milissegundos; o valor padrão é "60000"
queueLimit: 0,
enableKeepAlive: true,
keepAliveInitialDelay: 0,
});
const mysql = require('mysql2');
// Cria a conexão (pool). As definições específicadas do "createPool" são as predefinições padrões
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
database: 'test',
waitForConnections: true,
connectionLimit: 10,
maxIdle: 10, // Máximo de conexões inativas; o valor padrão é o mesmo que "connectionLimit"
idleTimeout: 60000, // Tempo limite das conexões inativas em milissegundos; o valor padrão é "60000"
queueLimit: 0,
enableKeepAlive: true,
keepAliveInitialDelay: 0,
});
O pool não estabelece todas as conexões previamente, mas as cria sob demanda até que o limite de conexões seja atingido.
Você pode usar o pool da mesma maneira como em uma conexão (usando pool.query()
e pool.execute()
):
- Promise
- Callback
try {
// Para a inicialização do "pool", veja acima
const [rows, fields] = await pool.query('SELECT `field` FROM `table`');
// A conexão é automaticamente liberada quando a consulta (query) é resolvida
} catch (err) {
console.log(err);
}
// Para a inicialização do "pool", veja acima
pool.query('SELECT `field` FROM `table`', function (err, rows, fields) {
// A conexão é automaticamente liberada quando a consulta (query) é resolvida
});
Alternativamente, também existe a possibilidade de adquirir manualmente uma conexão do pool e liberá-la posteriormente:
- Promise
- Callback
// Para a inicialização do "pool", veja acima
const conn = await pool.getConnection();
// Fazer algo com a conexão
await conn.query(/* ... */);
// Não se esqueça de liberar a conexão quando terminar!
pool.releaseConnection(conn);
// Para a inicialização do "pool", veja acima
pool.getConnection(function (err, conn) {
// Fazer algo com a conexão
conn.query(/* ... */);
// Não se esqueça de liberar a conexão quando terminar!
pool.releaseConnection(conn);
});
-
Adicionalmente, você pode liberar a conexão usando o objeto
connection
:conn.release();
Usando o Promise Wrapper
O MySQL2 também suporta Promise API. O que funciona muito bem com o ES7 async await.
import mysql from 'mysql2/promise';
async function main() {
// Cria a conexão com o Banco de Dados
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'test',
});
// Consulta no Banco de Dados
const [rows, fields] = await connection.execute(
'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
['Morty', 14]
);
}
O MySQL2 usa o objeto Promise
padrão disponível no escopo. Mas você pode escolher qual implementação de Promise
deseja usar.
// Obtém o cliente
import mysql from 'mysql2/promise';
// Obtém a implementação de "Promise" (nós usaremos o "bluebird")
import bluebird from 'bluebird';
// Cria a conexão, especificando o "bluebird" como "Promise"
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'test',
Promise: bluebird,
});
// Consulta no Banco de Dados
const [rows, fields] = await connection.execute(
'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
['Morty', 14]
);
MySQL2 also exposes a .promise()
function on Pools, so you can create a promise/non-promise connections from the same pool.
import mysql from 'mysql2';
async function main() {
// create the pool
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
database: 'test',
});
// now get a Promise wrapped instance of that pool
const promisePool = pool.promise();
// query database using promises
const [rows, fields] = await promisePool.query('SELECT 1');
}
O MySQL2 também expõe o método .promise() em Pools, então você pode criar conexões "promise/non-promise" para o mesmo pool.
const mysql = require('mysql2');
// Cria a conexão
const conn = mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'test',
});
conn
.promise()
.query('SELECT 1')
.then(([rows, fields]) => {
console.log(rows);
})
.catch(console.log)
.then(() => conn.end());
Resultados em Array
Se você tiver duas colunas com o mesmo nome, pode preferir receber os resultados como um array, em vez de um objeto, para evitar conflitos. Isso é uma divergência da biblioteca Node MySQL.
Por exemplo: SELECT 1 AS `foo`, 2 AS `foo`
.
Você pode habilitar essa configuração tanto no nível de conexão (aplica-se a todas as consultas), quanto no nível de consulta (aplica-se apenas a essa consulta específica).
Connection Level
- Promise
- Callback
const conn = await mysql.createConnection({
host: 'localhost',
database: 'test',
user: 'root',
rowsAsArray: true,
});
const conn = mysql.createConnection({
host: 'localhost',
database: 'test',
user: 'root',
rowsAsArray: true,
});
Query Level
- Promise
- Callback
try {
const [results, fields] = await conn.query({
sql: 'SELECT 1 AS `foo`, 2 AS `foo`',
rowsAsArray: true,
});
console.log(results); // nessa consulta, "results" contêm um array de arrays ao invés de um array de objetos
console.log(fields); // "fields" mantêm-se inalterados
} catch (err) {
console.log(err);
}
conn.query(
{
sql: 'SELECT 1 AS `foo`, 2 AS `foo`',
rowsAsArray: true,
},
function (err, results, fields) {
console.log(results); // nessa consulta, "results" contêm um array de arrays ao invés de um array de objetos
console.log(fields); // "fields" mantêm-se inalterados
}
);
Precisa de ajuda? Faça sua pergunta no Stack Overflow ou GitHub. Se você encontrou um erro, registre-o no GitHub.