Introdução: Por que TypeScript e PostgreSQL são a combinação ideal para o seu projeto
\n\nVocê já se perguntou por que os desenvolvedores estão cada vez mais escolhendo a combinação TypeScript e PostgreSQL? Não é apenas uma tendência da moda — é uma dupla poderosa que está mudando as regras do jogo no desenvolvimento web moderno. Imagine um canivete suíço e um cofre confiável em um só: o TypeScript traz rigor e previsibilidade ao código, enquanto o PostgreSQL oferece confiabilidade e flexibilidade no armazenamento de dados.
\n\nNeste guia, não vamos apenas passar pela teoria. Vamos mergulhar na prática real: configurar a conexão, escrever consultas, criar uma API e entender como evitar erros comuns. Pronto? Vamos lá!
\n\nConfiguração do ambiente: por onde começar com TypeScript e PostgreSQL
\n\nAntes de escrever código, vamos preparar o terreno. A instalação das dependências é como a fundação de uma casa: quanto mais sólida, mais tempo o projeto vai durar.
\n\nInstalação dos pacotes necessários
\n\nVamos precisar de duas ferramentas principais: pg (cliente para PostgreSQL) e typescript com os tipos. Execute no terminal:
npm init -y\nnpm install pg\nnpm install -D typescript @types/node @types/pg\nnpx tsc --init\n\n\nObserve: instalamos os tipos para pg separadamente. Isso é obrigatório para trabalhar com banco de dados TypeScript — caso contrário, o compilador reclamará da falta de tipos.
Estrutura básica do projeto
\n\nCrie o arquivo database.ts — este será o coração da nossa conexão. Aqui está um modelo mínimo, mas funcional:
import { Pool } from 'pg';\n\nconst pool = new Pool({\n user: 'your_username',\n host: 'localhost',\n database: 'your_database',\n password: 'your_password',\n port: 5432,\n});\n\nexport default pool;\n\n\nPor que Pool e não um cliente comum? O Pool gerencia um pool de conexões, o que é essencial para produção. Imagine que cada requisição é um visitante de um café. Sem o pool, você abriria um novo café para cada cliente. Com o pool, você já tem algumas mesas prontas e apenas acomoda os convidados.
Operações básicas: CRUD em TypeScript com PostgreSQL
\n\nAgora a parte mais interessante — escrever consultas. Vamos criar uma tabela simples de usuários e implementar todas as quatro operações: Create, Read, Update, Delete.
\n\nCriação da tabela
\n\nAntes de trabalhar com dados, precisamos criar a estrutura. Veja como fazer isso via TypeScript:
\n\nimport pool from './database';\n\nasync function createTable() {\n const query = `\n CREATE TABLE IF NOT EXISTS users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL,\n email VARCHAR(255) UNIQUE NOT NULL,\n age INTEGER CHECK (age > 0),\n created_at TIMESTAMP DEFAULT NOW()\n );\n `;\n \n try {\n await pool.query(query);\n console.log('Tabela users criada');\n } catch (error) {\n console.error('Erro:', error);\n }\n}\n\ncreateTable();\n\n\nObserve o SERIAL — é um auto-incremento que o PostgreSQL gera automaticamente. E o CHECK garante que a idade seja positiva. Isso é um exemplo de como PostgreSQL TypeScript juntos garantem a integridade dos dados em dois níveis.
Adicionar dados (Create)
\n\nInserção com parâmetros é uma forma segura de evitar injeção SQL:
\n\ninterface User {\n name: string;\n email: string;\n age: number;\n}\n\nasync function addUser(user: User) {\n const query = `\n INSERT INTO users (name, email, age)\n VALUES ($1, $2, $3)\n RETURNING *;\n `;\n \n const values = [user.name, user.email, user.age];\n \n try {\n const result = await pool.query(query, values);\n console.log('Usuário adicionado:', result.rows[0]);\n return result.rows[0];\n } catch (error) {\n console.error('Erro ao adicionar:', error);\n throw error