Neste projeto da Trybe de codinome "One For All", realizei a normalização de uma tabela na terceira forma normal, criei seu diagrama e acessei as informações através de queries utilizando SQL com MySQL Workbench.
🐳 Rodando no Docker vs Localmente
Rode os serviços
node
edb
com o comandodocker-compose up -d
.
- Lembre-se de parar o
mysql
se estiver usando localmente na porta padrão (3306
), ou adapte, caso queria fazer uso da aplicação em containers. A recomendação é pela performance do seu computador, pois odocker-compose.yml
está configurado para mapear a porta padrão domysql
do container para a porta3307
e não3306
. - Esses serviços irão inicializar um container chamado
one_for_all
e outro chamadoone_for_all_db
. - A partir daqui você pode rodar o container
one_for_all
via CLI ou abri-lo no VS Code.
Use o comando
docker exec -it one_for_all bash
.
- Ele te dará acesso ao terminal interativo do container criado pelo compose, que está rodando em segundo plano;
- As credencias de acesso ao banco de dados estão definidas no arquivo
docker-compose.yml
, e são acessíveis no container através das variáveis de ambienteMYSQL_USER
eMYSQL_PASSWORD
. 💡
Instale as dependências [Caso existam] com
npm install
⚠ Atenção ⚠ Caso opte por utilizar o Docker, TODOS os comandos disponíveis no package.json
(npm start, npm test, npm run dev, ...) devem ser executados DENTRO do container, ou seja, no terminal que aparece após a execução do comando docker exec
citado acima.
⚠ Atenção ⚠ O git dentro do container não vem configurado com suas credenciais. Ou faça os commits fora do container, ou configure as suas credenciais do git dentro do container.
⚠ Atenção ⚠ Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador.
⚠ Atenção ⚠ Caso você esteja usando macOS e ao executar o docker-compose up -d
se depare com o seguinte erro:
The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.db: 'platform'
Unsupported config option for services.node: 'platform'
Foram encontradas 2 possíveis soluções para este problema:
- Você pode adicionar manualmente a option
platform: linux/amd64
no service do banco de dados no arquivo docker-compose.yml do projeto, mas essa é uma solução local e você deverá reproduzir isso para os outros projetos.- Você pode adicionar manualmente nos arquivos .bashrc, .zshenv ou .zshrc do seu computador a linha
export DOCKER_DEFAULT_PLATFORM=linux/amd64
, essa é uma solução global. As soluções foram com base nesta fonte.
docker-compose --version
Se não for a versão 1.29, faça os seguintes comandos para atualizar a versão:
sudo rm /usr/local/bin/docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Instale as dependências [Caso existam] com
npm install
⚠ Atenção ⚠ Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador.
✨ Dica: Para rodar o projeto desta forma, obrigatoriamente você deve ter o node
instalado em seu computador.
✨ Dica: O avaliador espera que a versão do node
utilizada seja a 16.
🧑💻 Implementações técnicas
Algumas coisas devem seguir um padrão pré-estabelecido para que os testes de correção funcionem adequadamente:
- Ao modelar o banco de dados no desafio 1:
- Quando for preciso que uma
coluna_a
referencie uma colunacoluna_b
em outra tabela, é necessário que nacoluna_a
haja restrição de foreign key e quecoluna_b
seja uma primary key;
-
Todos os desafios que pedirem para criar uma query devem possuir no seu arquivo
.sql
correspondente somente a query solicitada. -
Para executar localmente os testes é preciso escrever adicionar variáveis de ambiente com suas credências do
mysql
, você pode fazer de algumas formas: -
Adicionando os dados a arquivo um arquivo com o nome
.env
, como no estão no de exemplo,.env.example
, basta renomeá-lo e ajustá-lo com suas credenciais:
# ./.env
MYSQL_USER=root # ou seu usuário
MYSQL_PASSWORD=suaSenha # senha do usuário acima
MYSQL_HOSTNAME=localhost # o padrão é `localhost`
MYSQL_PORT=3306 # a padrão é `3306`
- Depois disso basta rodar `npm test` ou `npm test -- -t "<número-do-requisito>"
- Você também pode usar as variáveis de ambiente antes do comando
npm test
como abaixo:sh MYSQL_USER=<SEU_NOME_DE_PESSOA_USUARIA> MYSQL_PASSWORD=<SUA SENHA> MYSQL_HOSTNAME=<NOME_DO_HOST> MYSQL_PORT=<PORTA> npm test
-
Ou seja, suponha que para poder acessar a base de dados feita neste projeto você tenha
root
como seu nome de pessoa usuária,password
como senha,localhost
como host e1337
como porta. Logo, você executaria:MYSQL_USER=root MYSQL_PASSWORD=password MYSQL_HOSTNAME=localhost MYSQL_PORT=1337 npm test
-
Usando o exemplo anterior de base, suponha que você não tenha setado uma senha para
root
e esteja usando a porta padrão (3306). Neste caso, você executaria:MYSQL_USER=root MYSQL_PASSWORD= MYSQL_HOSTNAME=localhost MYSQL_PORT= npm test
Dica: variáveis de ambiente definidas na mesma linha do comando valem apenas para aquele comando. Se preferir, você pode exportar as variáveis de ambiente para toda a sessão (todos os comandos até você fechar aquele terminal). Por exemplo:
export MYSQL_USER=root MYSQL_PASSWORD=password HOSTNAME=localhost PORT=3306
E depois disso você só precisa rodar npm test
quando for testar os projetos.
docker run -p 3306:3306 --name mysql_57 -e MYSQL_ROOT_PASSWORD=1234 -d mysql:8.0.23 mysqld --default-authentication-plugin=mysql_native_password
O que está sendo feito
> 👉 ideia geral: - Baixa e executa uma imagem _docker_ do MySQL na versão 8.0.23.
👉 flag --name:
- Define um nome para o nosso container: "meu-mysql-8_0".
👉 flag -e:
- Define a variável de ambiente "MYSQL_ROOT_PASSWORD" com o valor "1234".
👉 flag -d:
- Define que o container rode em segundo plano.
👉 flag -p:
- Mapeia uma porta local a uma porta do container.
👉 mysql:5.7:
- Define qual versão da imagem mySQL queremos, no caso, a 8.0.23, que é a esperada pelo avaliador.
Utilizando o comando acima, para executar os testes localmente basta digitar no terminal:
MYSQL_USER=root MYSQL_PASSWORD=1234 HOSTNAME=localhost npm test
Você pode acrescentar ao comando sufixo para rodar apenas um requisito assim -- -t "<número-do-requisito>"
, exemplo com .env
:
npm test -- -t "01"
ou, sem o .env
:
MYSQL_USER=root MYSQL_PASSWORD=1234 HOSTNAME=localhost npm test -- -t "01"