No tutorial de hoje eu vou te ensinar como usar o query builder Knex.js em aplicações Node.js para interagir com o banco de dados PostgreSQL. Não sabe o que é um query builder? Calma que eu já vou explicar, apenas tenha em mente que este é um tutorial para quem já sabe Node.js, TypeScript e já conhece também o banco Postgres.
Caso precise de um conhecimento básico/reforço em TS, use este tutorial.
#1 – Driver nativo x Query Builder x ORM
Quando vamos criar uma aplicação que se conecta a um banco de dados para consultar e guardar dados nós temos três abordagens para fazê-lo:
- usando o driver nativo do banco para nossa linguagem;
- usando um query builder;
- usando um ORM (Object-Relationship Manager);
Cada uma dessas três abordagens possui suas vantagens e desvantagens, bem como seus admiradores e detratores. Resumidamente, nós temos o seguinte comparativo:
- Driver: a forma “oficial”, com maior performance e que dá o maior trabalho (menos produtiva) por envolver uso direto de SQL e nenhuma abstração de dados. No caso do PostgreSQL por exemplo, seria desenvolver usando o pacote pg, como já fizemos nesse outro tutorial.
- ORM: a forma mais “comum” e mais produtiva de desenvolver. Nela, você lida apenas com objetos, o mais alto grau de abstração na programação, sem tocar em SQL. No entanto, a conversão constante de e para objetos torna esta a forma mais lenta em termos de performance. Um exemplo famoso é o Sequelize, que já usamos nesse outro tutorial.
- Query Builder: nessa abordagem, usamos objetos para construção das queries, o que representa um grau médio de abstração, mas mais leve do que o presente nos ORMs, mas mais produtivo do que gerenciar tudo na mão como no driver nativo. Pode-se dizer que os Query Builders como o Knex.js são o meio termo entre performance e produtividade no mundo de desenvolvimento.
Entendido esse ponto inicial em relação às abordagens, vamos em frente.
#2 – Ambiente e Projeto
Se você nunca programou com Node e Postgre antes, vou deixar abaixo um vídeo ensinando a instalação do ambiente.

Quando estiver com o ambiente pronto, pode criar o banco e tabela para nossa aplicação.
Agora, crie uma pasta na sua máquina para o projeto, eu vou usar o nome “crud-knex-postgresql”. Abra o terminal e dentro dessa pasta rode um “npm init -y” para inicializar o projeto e criar o package.json.
Ainda no terminal, mande instalar as dependências que vamos precisar neste tutorial
npm i pg knex dotenvA saber:
- pg: pacote com o driver nativo para PostgreSQL;
- Knex: pacote do query builder Knex.js;
- DotEnv: pacote para gestão das variáveis de ambiente;
Outras opções de banco de dados possíveis seriam CockroachDB, MS SQL Server, MySQL, MariaDB, SQLite3, Better-SQLite3, Oracle e Amazon Redshift, bastando mudar o conector (pg).
E agora as dependências de desenvolvimento:
npm i -D typescript tsx @types/nodeSendo:
- TypeScript: pacote para usarmos TypeScript no projeto;
- TSX: pacote que permite executar TS direto, sem transpilar para JS;
- @types/node: pacote para os types do Node.js nativo;
E depois inicialize o TypeScript no projeto.
npx tsc --initE ajuste seu package.json para que o type do projeto seja module, ao invés de commonjs e o script de start.
"type": "module",
"scripts": {
"start": "tsx src/index.ts"
},
Feito isso, agora crie um arquivo .env na raiz do seu projeto e dentro coloque as seguintes variáveis de ambiente, devidamente configuradas com os dados do servidor PostgreSQL que você vai usar.
- NODE_ENV=development
- DB_HOST=localhost
- DB_PORT=5432
- DB_USER=luiztools
- DB_PASSWORD=
- DB_DATABASE=luiztools
- DEBUG=knex:query
A variável debug serve para o Knex imprimir no terminal o SQL que ele está executando no banco de dados, algo útil durante o desenvolvimento.
E com isso terminamos o setup inicial do projeto.
#3 – Configurando o Knex
O primeiro passo é criarmos uma pasta src na raiz do projeto e dentro dela uma pasta config, onde guardaremos arquivos de configuração. O primeiro arquivo de configuração que vamos precisar é o knex.ts, que como o próprio nome sugere, configura o query builder.
import "dotenv/config";
import Knex from "knex";
const knex = Knex({
client: "pg",
connection: {
host: `${process.env.DB_HOST}`,
port: Number(process.env.DB_PORT),
user: `${process.env.DB_USER}`,
password: `${process.env.DB_PASSWORD}`,
database: `${process.env.DB_DATABASE}`,
},
pool: {
min: 2,
max: 10,
},
});
export const onDatabaseConnect = () => knex.raw("SELECT 1");
export default knex;
Começamos importando as variáveis de ambiente e depois o pacote do Knex. Como é comum em abstrações de banco de dados, primeiro precisamos apontar nosso query builder para o nosso banco (connection), bem como dizer qual o client de banco que vamos usar (pg) e as configurações de pool de conexões, algo opcional, mas recomendado para maior performance.
Após as configurações de conexão do Knex, eu crio e exporto uma função que testa a conexão. Se tudo estiver correto, essa função vai retornar uma linha com o número 1, caso contrário, um erro.
Por fim, exporto como default o objeto do Knex, devidamente conectado.
Agora vamos ao index.ts que deve existir dentro de src para escrever um código inicial que testa a conexão usando o Knex.




