Fala galera! Tudo bem com vocês?
Hoje vou falar mais um pouco sobre Node.js, especificamente sobre acesso ao banco de dados PostgreSQL, no post vou mostrar como fazer consultas utilizando procedures e o quão fácil é fazer isso!
Aí você pode falar: “Nossa, mas ninguém usa procedures mais”. Aí que você se engana, muita gente ainda utiliza esse poderoso recurso do banco de dados, e é por isso que surgiu esse conteúdo!
Para fazer o acesso ao banco, vamos utilizar um pacote chamado smn-pg, que é mantido pela empresa SMN e está disponível pra nós no npm.
Então para começar, vamos instalar o SMN-PG usando o seguinte comando:
npm install smn-pg
Feito isso, podemos iniciar a nossa brincadeira. O primeiro passo é configurar o objeto de configuração com o banco de dados para posteriormente utilizarmos na requisição do pacote, como no exemplo a seguir:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let config = { | |
user: 'username', | |
database: 'database', | |
password: 'pass', | |
host: 'host', | |
port: 5432, | |
max: 10, | |
idleTimeoutMillis: 30000 | |
}; | |
const pg = require('smn-pg')(config); |
Agora, vamos aos exemplos! Tomando como base, que temos a seguinte procedure em nosso banco de dados:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CREATE OR REPLACE FUNCTION autenticacao.BuscarUsuario(pNome varchar(50), pNomeDaMae varchar(50)) | |
RETURNS TABLE( | |
"id" integer, | |
"nome" varchar(50), | |
"nomeDaMae" varchar(50) | |
) AS $$ | |
BEGIN | |
RETURN QUERY | |
SELECT u.id, | |
u.nome, | |
u.nomeDaMae | |
FROM autenticacao.usuario u | |
WHERE u.nome ILIKE pNome | |
AND u.nomeDaMae ILIKE pNomeDaMae; | |
END; | |
$$ | |
LANGUAGE plpgsql; |
Podemos executá-la, de quatro maneiras diferentes:
- Passando os parâmetros na mesma ordem da função;
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pg.request() | |
.input('Rafael') //pNome | |
.input('Magally') //pNomeDaMae | |
.execute('autenticacao.BuscarUsuario', (err, data) => { | |
if (err) | |
return console.log(err); | |
console.log(data); | |
}); |
- Passando os parâmetros na mesma ordem da função, porém, de uma única vez:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pg.request() | |
.inputMany('Jorge' /*pNome*/, 'Maria das Dores' /*pNomeDaMae*/) | |
.execute('autenticacao.BuscarUsuario', (err, data) => { | |
if (err) | |
return console.log(err); | |
console.log(data); | |
}); |
- Passando os parâmetros com nome e valor;
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pg.request() | |
.input('pNome','Douglas') | |
.input('pNomeDaMae','Marina') | |
.execute('autenticacao.BuscarUsuario', (err, data) => { | |
if (err) | |
return console.log(err); | |
console.log(data); | |
}); |
- Passando um objeto composto pelo nome e valor dos parâmetros;
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let parameters = { | |
pNome: 'Maria', | |
pNomeDaMae: 'Mãe da Maria' | |
}; | |
pg.request() | |
.input(parameters) | |
.execute('autenticacao.BuscarUsuario', (err, data) => { | |
if (err) | |
return console.log(err); | |
console.log(data); | |
}); |
- E com o objeto também podemos passar um prefixo para os nossos parâmetros, como em nosso exemplo, todo parâmetros tem a letra “p” antes, podemos especificar isso na chamada da função, veja no exemplo:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let parameters = { | |
nome: 'Mateus', | |
nomeDaMae: 'Neide' | |
}; | |
pg.request() | |
.input(parameters, 'p') | |
.execute('autenticacao.BuscarUsuario', (err, data) => { | |
if (err) | |
return console.log(err); | |
console.log(data); | |
}); |
Além do método “execute” também podemos utilizar o método “executeOne”, que é utilizado para retornar apenas um resultado.
O resultado da execução das procedures é o seguinte:
Fácil, não?
O código do pacote está disponível para sugestões, alterações e melhorias no GitHub, em: https://github.com/smn-official/smn-pg.
Por hoje é só, qualquer dúvida ou sugestão, estou à disposição! Até mais 😀
interessante, eu gostaria de ver usar o banco usando algum orm (sequelize, etc)
GostarGostar
Fala Edi! Obrigado pelo feedback e pela sugestão, vou trabalhar em algo do tipo! Abraços 😀
GostarGostar