Tutorial: Node.js + SQLite + Promises
Neste tutorial você vai acompanhar como o uso de Promises pode ajudar no acesso à um banco de dados relacional com Node.js.
SQLite: Leve e portável
Eu particularmente gosto de utilizar o SQLite em pequenos protótipos. Para quem não sabe o SQLite é um pequeno banco de dados relacional que tem somente um arquivo e dispensa um processo separado.
Ou seja, se você está procurando um banco de dados de leve para armazenar poucos dados, o SQLite é uma boa escolha.
Node.js com SQLite
Para você utilizar Node.js com SQLite, primeiramente precisamos instalar uma biblioteca que funciona como um Driver de conexão:
npm install sqlite3 --save
Lembrando que esta biblioteca foi escrita em C e se você estiver usando Windows é importante seguir estes passos antes da instalação: Building-On-Windows
Concluído o processo de instalação já conseguimos usar o SQLite com Node.js. Tente executar o seguinte código:
const sqlite3 = require('sqlite3');
const db = new sqlite3.Database('./database.sqlite', (error) => {
if (error) {
console.log(error);
return;
}
db.run('create table if not exists people (id integer primary key, name text)', (error) => {
if (error) {
console.log(error);
return;
}
db.run('insert into people (name) values (?)', ['Gabriel'], (error) => {
if (error) {
console.log(error);
return;
}
db.all('select * from people', (error, rows) => {
console.log(error, rows);
db.close();
});
});
});
});
Embora este código funcione sem erros, é fácil perceber que a ligibilidade dele fica comprometida, uma vez que temos várias funções de callback encadeadas (algo conhecido como CallbackHell).
A biblioteca sqlite3 traz uma alternativa para resolver este problema. O método serialize enfileira todas as queries e executa os comandos na ordem de declaração.
Veja o mesmo exemplo, mas agora com serialize:
const sqlite3 = require('sqlite3');
const db = new sqlite3.Database('./database.sqlite', (error) => {
if (error) console.log(error);
});
db.serialize(() => {
db.run('create table if not exists people (id integer primary key, name text)', (error) => {
if (error) console.log(error);
});
db.run('insert into people (name) values (?)', ['Gabriel'], (error) => {
if (error) console.log(error);
});
db.all('select * from people', (error, rows) => {
console.log(error, rows);
});
});
db.close();
A legibilidade do código melhorou bastante, mas pode melhorar ainda mais.
Node.js + SQLite + Promises
Uma execelente alternativa para melhorar a legibilidade de código assíncrono é utilizar Promises.
Você não sabe o que são Promises? Então recomendo que leia este artigo da BrazilJs, mas já vou te dizer que é uma das melhores funcionalidades já lançadas no JavaScript.
Para utilizar SQLite com Promises adicione mais uma biblioteca no seu projeto:
npm install sqlite --save
Lembrando este pacode funciona em conjunto com o pacote instalado no início deste artigo. Ou seja, você precisa ter os dois pacotes instalados no seu projeto (sqlite3 e sqlite).
E o código fica da seguinte maneira:
const sqlite3 = require('sqlite3');
const sqlite = require('sqlite');
async function main() {
try {
const db = await sqlite.open({ filename: './database.sqlite', driver: sqlite3.Database });
await db.run(`create table if not exists people (id integer primary key, name text)`);
await db.run('insert into people (name) values (?)', ['Gabriel']);
const rows = await db.all('select * from people');
console.log(rows);
await db.close();
} catch (error) {
console.log(error);
}
}
main();
Agora é possível perceber como o uso de Promises deixou o código mais limpo e organizado, facilitando o entendimento.
Lembrando que neste artigo eu utilizei as seguintes versões:
Dúvidas ou sugestões é só entrar em contato. Abraço.