Um projeto CRUD completo de produtos utilizando FastAPI, MySQL e padrão arquitetural MVC com boas práticas de Clean Code.
O projeto segue o padrão MVC (Model-View-Controller) com as seguintes camadas:
- Models: Entidades do banco de dados (SQLAlchemy)
- Views: Schemas Pydantic para validação e serialização
- Controllers: Endpoints da API (FastAPI)
- Services: Lógica de negócio
- Repositories: Acesso aos dados
fastapi_crud_mysql/
├── app/
│ ├── config/
│ │ ├── __init__.py
│ │ └── database.py
│ ├── controllers/
│ │ ├── __init__.py
│ │ └── product_controller.py
│ ├── models/
│ │ ├── __init__.py
│ │ └── product.py
│ ├── repositories/
│ │ ├── __init__.py
│ │ └── product_repository.py
│ ├── schemas/
│ │ ├── __init__.py
│ │ └── product.py
│ ├── services/
│ │ ├── __init__.py
│ │ └── product_service.py
│ └── main.py
├── config.env.example
├── requirements.txt
├── run.py
├── test_api.py
├── .gitignore
└── README.md
# Ativar o ambiente virtual
venv\Scripts\activate # Windows
source venv/bin/activate # Linux/Mac
# Instalar dependências
pip install -r requirements.txt
- Certifique-se de que o MySQL está instalado e rodando
- Crie um banco de dados chamado
fastapi_crud
- Configure as credenciais no arquivo
config.env
:
# Copie o arquivo de exemplo
cp config.env.example config.env
# Edite o arquivo config.env com suas credenciais
DATABASE_URL=mysql+mysqlconnector://seu_usuario:sua_senha@localhost:3306/fastapi_crud
DATABASE_HOST=localhost
DATABASE_PORT=3306
DATABASE_NAME=fastapi_crud
DATABASE_USER=seu_usuario
DATABASE_PASSWORD=sua_senha
# Executar com uvicorn
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
# Ou executar diretamente
python app/main.py
Método | Endpoint | Descrição |
---|---|---|
POST |
/products/ |
Criar novo produto |
GET |
/products/ |
Listar todos os produtos |
GET |
/products/{id} |
Buscar produto por ID |
PUT |
/products/{id} |
Atualizar produto |
DELETE |
/products/{id} |
Remover produto |
GET |
/products/search/ |
Buscar produtos por nome |
GET |
/products/low-stock/ |
Produtos com estoque baixo |
GET |
/products/statistics/ |
Estatísticas dos produtos |
Método | Endpoint | Descrição |
---|---|---|
GET |
/ |
Informações da API |
GET |
/health |
Status da API |
GET |
/docs |
Documentação Swagger |
GET |
/redoc |
Documentação ReDoc |
curl -X POST "http://localhost:8000/products/" \
-H "Content-Type: application/json" \
-d '{
"name": "Smartphone Samsung Galaxy",
"description": "Smartphone com tela de 6.1 polegadas",
"price": 1299.99,
"stock_quantity": 50
}'
curl -X GET "http://localhost:8000/products/?skip=0&limit=10"
curl -X GET "http://localhost:8000/products/1"
curl -X PUT "http://localhost:8000/products/1" \
-H "Content-Type: application/json" \
-d '{
"price": 1199.99,
"stock_quantity": 45
}'
curl -X DELETE "http://localhost:8000/products/1"
- Separação de Responsabilidades: Cada camada tem sua responsabilidade específica
- Injeção de Dependência: Uso de
Depends()
do FastAPI - Validação de Dados: Schemas Pydantic para validação
- Tratamento de Erros: HTTPExceptions apropriadas
- Documentação: Docstrings completas
- Type Hints: Tipagem estática em todo o código
- Clean Code: Código limpo e legível
- Repository Pattern: Encapsulamento do acesso aos dados
- Service Layer: Lógica de negócio separada
- Preço deve ser maior que zero
- Quantidade em estoque não pode ser negativa
- Nome do produto é obrigatório
- Limites de tamanho para strings
- Paginação para listagens
- Busca por nome (busca parcial)
- Produtos com estoque baixo
- Estatísticas dos produtos
- Paginação em todas as listagens
- Documentação automática (Swagger/ReDoc)
- FastAPI: Framework web moderno e rápido
- SQLAlchemy: ORM para Python
- MySQL: Banco de dados relacional
- Pydantic: Validação de dados
- Uvicorn: Servidor ASGI
- Python-dotenv: Gerenciamento de variáveis de ambiente
- Configuração do Banco: Certifique-se de que o MySQL está rodando e as credenciais estão corretas
- Ambiente Virtual: Sempre use o ambiente virtual para evitar conflitos de dependências
- Variáveis de Ambiente: Configure o arquivo
config.env
com suas credenciais - Documentação: Acesse
/docs
para ver a documentação interativa da API - Git: O arquivo
config.env
está no.gitignore
para proteger suas credenciais
O projeto inclui um .gitignore
completo que protege:
- Credenciais:
config.env
(contém senhas do banco) - Ambiente Virtual:
venv/
(dependências locais) - Cache Python:
__pycache__/
,*.pyc
- Logs:
*.log
- Arquivos de IDE:
.vscode/
,.idea/
- Arquivos de Sistema:
.DS_Store
,Thumbs.db
- Nunca commite o arquivo
config.env
(já está no.gitignore
) - Use
config.env.example
como template - Mantenha suas credenciais seguras
- Compartilhe apenas o código, não as configurações sensíveis
Para contribuir com o projeto:
- Faça um fork do repositório
- Crie uma branch para sua feature
- Implemente suas mudanças seguindo as boas práticas
- Teste suas alterações
- Faça um pull request
Este projeto está sob a licença MIT.