menu

SHARKLABS

Tutorial: Node.js + SQLite + Promises

/
/
Tutorial: Node.js + SQLite + Promises
bookmark Node.js access_time

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.

Autor
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." Martin Fowler