Projeto de estudo com foco no uso do Query Builder do Knex em uma API Node.js com Express, TypeScript e SQLite.
O objetivo principal deste projeto foi praticar:
- Criacao de tabelas com migrations
- Insercao de dados com seeds
- Consultas com
select,insert,whereejoin - Relacionamento entre tabelas usando chave estrangeira
- Integracao do Knex com uma API REST simples
- Node.js
- TypeScript
- Express
- Knex
- SQLite3
- TSX
Atualmente o projeto trabalha com duas tabelas principais:
-
coursesidnamecreated_atupdated_at
-
course_modulesidnamecourse_id
O relacionamento entre elas e:
- Um curso pode ter varios modulos
- Cada modulo pertence a um curso
Instale as dependencias:
npm installInicie o servidor em desenvolvimento:
npm run devO servidor sobe na porta 3333.
O projeto usa SQLite com configuracao no arquivo knexfile.ts.
Se estiver rodando o projeto dentro do WSL, o ideal e manter o banco em um caminho acessivel e consistente para o ambiente em que a aplicacao esta sendo executada.
Exemplo de caminho:
filename: '/mnt/c/dev/db/database.db'Antes de usar esse caminho, garanta que a pasta e o arquivo existem:
mkdir -p /mnt/c/dev/db
touch /mnt/c/dev/db/database.dbCriar uma nova migration:
npm run knex -- migrate:make nome-da-migrationRodar as migrations:
npm run knex -- migrate:latestDesfazer a ultima migration:
npm run knex -- migrate:rollbackCriar uma nova seed:
npm run knex -- seed:make nome-da-seedRodar as seeds:
npm run knex -- seed:runNo projeto existe uma seed para popular a tabela courses com alguns cursos iniciais.
Retorna uma mensagem simples de teste da API.
Cria um novo curso.
Exemplo de body:
{
"name": "TypeScript"
}Cria um novo modulo relacionado a um curso.
Exemplo de body:
{
"name": "Introducao ao Knex",
"course_id": 1
}Lista todos os modulos cadastrados.
Lista os modulos de um curso especifico usando join entre courses e course_modules.
Insercao com Query Builder:
await knex('course_modules').insert({ name, course_id });Consulta simples:
const modules = await knex('course_modules').select();Consulta com filtro:
.where('courses.id', req.params.id)Consulta com join:
const courses = await knex('courses')
.select(
'courses.id as course_id',
'course_modules.id as course_module_id',
'course_modules.name as module',
'courses.name as course',
)
.join('course_modules', 'courses.id', 'course_modules.course_id')
.where('courses.id', req.params.id);Durante o desenvolvimento deste projeto, os principais pontos praticados foram:
- Diferenca entre migrations e seeds
- Uso de
import typeem ambiente ESM com TypeScript - Cuidados com caminhos de banco no WSL
- Como evitar ambiguidade de colunas em
join - Como relacionar tabelas com foreign key usando Knex
- Como estruturar uma API REST simples com Express
- Como integrar o Knex ao fluxo da aplicacao
- Como criar tabelas com chave primaria auto-incremental
- Como adicionar novas colunas com
alterTable - Como popular o banco com dados iniciais usando seeds
- Como usar
insertcom Query Builder e tambem com SQL raw - Como entender a diferenca entre os metodos do Knex e o uso de
knex.raw - Como retornar dados filtrados por parametro de rota
- Como listar registros relacionados entre tabelas
- Como organizar a camada de banco em arquivos separados
- Como usar aliases em colunas para deixar o retorno do
joinmais claro - Como depurar erros de configuracao do Knex e do SQLite