API REST desarrollada con FastAPI y PostgreSQL, utilizando SQLAlchemy como ORM y Alembic para migraciones de base de datos. El proyecto está completamente dockerizado para facilitar el desarrollo y despliegue.
- FastAPI - Framework web moderno y rápido para construir APIs
- PostgreSQL 16 - Base de datos relacional
- SQLAlchemy - ORM para Python con soporte async
- Alembic - Herramienta de migraciones de base de datos
- Docker & Docker Compose - Containerización
- Pytest - Framework de testing con soporte async
- Pydantic - Validación de datos
FastAPISQL/
├── app/
│ ├── crud/ # Operaciones CRUD
│ ├── models/ # Modelos SQLAlchemy
│ ├── routers/ # Endpoints de la API
│ ├── schemas/ # Esquemas Pydantic
│ ├── database.py # Configuración de base de datos
│ └── main.py # Aplicación principal
├── alembic/
│ └── versions/ # Migraciones de base de datos
├── tests/ # Tests unitarios e integración
├── docker-compose.yml # Orquestación de servicios
├── Dockerfile # Imagen de la aplicación
├── requirements.txt # Dependencias Python
├── pytest.ini # Configuración de pytest
└── .env # Variables de entorno
- Docker Desktop instalado
- Docker Compose
- Clonar el repositorio
git clone <tu-repositorio>
cd FastAPISQL- Configurar variables de entorno
El archivo .env ya contiene la configuración por defecto:
DATABASE_URL=postgresql+asyncpg://postgres:postgres@db:5432/app_dbModo normal (con logs en consola):
docker-compose upModo detached (en segundo plano):
docker-compose up -dReconstruir imágenes:
docker-compose up --builddocker-compose logs -f
docker-compose logs -f api # Solo API
docker-compose logs -f db # Solo PostgreSQLdocker-compose downdocker-compose down -vLa API estará disponible en: http://localhost:8000
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
| Método | Endpoint | Descripción |
|---|---|---|
| GET | / |
Mensaje de bienvenida |
| POST | /users/ |
Crear un nuevo usuario |
| GET | /users/ |
Listar todos los usuarios |
| GET | /users/{user_id} |
Obtener un usuario por ID |
| PUT | /users/{user_id} |
Actualizar un usuario |
| DELETE | /users/{user_id} |
Eliminar un usuario |
Crear usuario:
curl -X POST "http://localhost:8000/users/" \
-H "Content-Type: application/json" \
-d '{
"name": "Juan Pérez",
"email": "juan@example.com",
"age": 30,
"cellphone": "555-1234"
}'pytest -vpytest --cov=appdocker-compose exec api pytest -vdocker-compose exec api alembic revision --autogenerate -m "descripción del cambio"docker-compose exec api alembic upgrade headdocker-compose exec api alembic downgrade -1docker-compose exec api alembic historydocker-compose exec db pg_dump -U postgres app_db > backup_$(date +%Y%m%d_%H%M%S).sqldocker-compose exec -T db psql -U postgres app_db < backup.sqldocker-compose exec db psql -U postgres -d app_db- Usuario: postgres
- Contraseña: postgres
- Base de datos: app_db
- Puerto: 5432
El proyecto está configurado con volúmenes de Docker que permiten la recarga automática de código:
- Cualquier cambio en archivos
.pyse refleja automáticamente - No es necesario reconstruir la imagen para cambios de código
- Solo reconstruye si cambias
requirements.txt
Si prefieres ejecutar sin Docker, necesitarás:
- Instalar PostgreSQL localmente
- Crear un entorno virtual
python -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # Linux/Mac- Instalar dependencias
pip install -r requirements.txt- Actualizar DATABASE_URL en .env
DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/app_db- Ejecutar migraciones
alembic upgrade head- Iniciar servidor
uvicorn app.main:app --reload- Los datos persisten en volúmenes de Docker, no se pierden al reconstruir imágenes
- Solo usa
docker-compose down -vsi quieres eliminar los datos - Las migraciones se ejecutan automáticamente al iniciar el contenedor
- El código se recarga automáticamente gracias a
--reloadde uvicorn
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT.