mysql
módulo usa ?
caracteres como espaços reservados para valores, por exemplo
connection
.query('SELECT ?, ?', [
'foo',
'bar'
]);
Este exemplo é equivalente a:
connection.query('SELECT ' + connection.escape('foo') + ', ' + connection.escape('bar'));
No entanto, essa abordagem se torna difícil de ler conforme a consulta se torna grande e a lista de valores longa.
Existe uma alternativa: marcadores de posição nomeados.
connection
.query('SELECT :foo, :bar', {
foo: 'FOO',
bar: 'BAR'
});
Este último é equivalente a:
connection.query('SELECT ' + connection.escape('FOO') + ', ' + connection.escape('BAR'));
Os nomes dos marcadores de posição podem aparecer várias vezes, por exemplo
connection
.query('SELECT :foo, :foo', {
foo: 'FOO'
});
Este último é equivalente a:
connection.query('SELECT ' + connection.escape('FOO') + ', ' + connection.escape('FOO'));
No momento em que este livro foi escrito, mysql
não oferece suporte a parâmetros nomeados .
No entanto, é fácil corrigir o Connection.prototype.query
protótipo para adicionar o suporte:
Primeiro, você precisa instalar o named-placeholders
pacote.
Em seguida, aplique o patch Connection.prototype.query
:
const toUnnamed = require('named-placeholders')();
const originalQuery = require('mysql/lib/Connection').prototype.query;
require('mysql/lib/Connection').prototype.query = function (...args) {
if (Array.isArray(args[0]) || !args[1]) {
return originalQuery.apply(this, args);
}
([
args[0],
args[1]
] = toUnnamed(args[0], args[1]));
return originalQuery.apply(this, args);
};
É isso aí. Agora você pode usar marcadores de posição nomeados.
Veja um artigo completo sobre como usar o MySQL em Node.js http://gajus.com/blog/8/using-mysql-in-node-js .