Por que FastAPI para healthcare
FastAPI combina validação automática via Pydantic, documentação OpenAPI gerada automaticamente e performance comparável a Node.js. Em projetos de saúde, a validação automática é especialmente valiosa — você define o schema uma vez e a API rejeita dados inválidos por padrão.
Estrutura do projeto
healthcare-api/
├── app/
│ ├── main.py
│ ├── models/
│ │ ├── patient.py
│ │ └── appointment.py
│ ├── schemas/
│ │ ├── patient.py
│ │ └── appointment.py
│ ├── services/
│ │ ├── patient_service.py
│ │ └── appointment_service.py
│ └── dependencies.py
├── tests/
└── pyproject.tomlDefinindo modelos com SQLModel
SQLModel unifica SQLAlchemy ORM e Pydantic em uma única classe. Você define o modelo uma vez e usa tanto para queries de banco quanto para validação de API.
from sqlmodel import SQLModel, Field
from datetime import date, datetime
from typing import Optional
class PatientBase(SQLModel):
name: str = Field(min_length=2, max_length=200)
cpf: str = Field(regex=r"\d{11}")
birth_date: date
class Patient(PatientBase, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
class PatientCreate(PatientBase):
pass
class PatientRead(PatientBase):
id: int
created_at: datetimeEndpoints com validação automática
from fastapi import APIRouter, Depends, HTTPException
from sqlmodel import Session
router = APIRouter(prefix="/patients", tags=["patients"])
@router.post("/", response_model=PatientRead, status_code=201)
async def create_patient(
patient: PatientCreate,
session: Session = Depends(get_session),
) -> PatientRead:
db_patient = Patient.model_validate(patient)
session.add(db_patient)
session.commit()
session.refresh(db_patient)
return db_patient
@router.get("/{patient_id}", response_model=PatientRead)
async def get_patient(patient_id: int, session: Session = Depends(get_session)):
patient = session.get(Patient, patient_id)
if not patient:
raise HTTPException(status_code=404, detail="Paciente não encontrado")
return patientReact Query no frontend
React Query gerencia o estado do servidor no frontend: cache, revalidação, loading/error states e background refresh. Para APIs de healthcare com dados que mudam, isso simplifica muito a lógica do cliente.
export function usePatient(id: number) {
return useQuery({
queryKey: ["patients", id],
queryFn: () => api.get<PatientRead>(`/patients/${id}`),
staleTime: 5 * 60 * 1000,
});
}
export function useCreatePatient() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: PatientCreate) => api.post<PatientRead>("/patients/", data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["patients"] });
},
});
}A documentação Swagger automática do FastAPI (em /docs) é especialmente útil em projetos de saúde onde há múltiplos times consumindo a API — todos têm a mesma fonte de verdade do contrato.