Apariencia
❌ Settings() no encuentra database_url (falta el paquete y el .env)
Clase 4 · en
core/config.py+db/database.py
🧨 Qué pasó
python
# core/config.py
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
database_url: str
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8")
settings = Settings()Dos errores encadenados al importar esto:
ModuleNotFoundError: No module named 'pydantic_settings'- Después de instalarlo, un error de validación de Pydantic:
database_urles obligatorio y no lo encuentra en ningún lado.
🔍 Causa
1) Paquete separado: desde Pydantic v2, BaseSettings (leer configuración desde variables de entorno) se sacó del paquete pydantic y pasó a vivir en un paquete aparte, pydantic-settings. Instalar pydantic no lo incluye — hay que instalarlo por separado.
2) Archivo .env inexistente: SettingsConfigDict(env_file=".env") le dice a Settings "buscá los valores en un archivo .env" — pero ese archivo todavía no existía en 02-Ejercicios/Clase-04/app/. Sin él, database_url (que es obligatorio, sin valor por defecto) no tiene de dónde salir.
Además, en db/database.py, settings se usaba (settings.database_url) sin importarlo — core/config.py lo define, pero cada archivo que lo necesita tiene que traerlo con su propio import.
✅ Solución
bash
pip install pydantic-settingsCrear 02-Ejercicios/Clase-04/app/.env (nunca se sube a git — agregado a .gitignore):
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/curso_backendY en db/database.py, importar settings antes de usarlo:
python
from core.config import settings
engine = create_engine(settings.database_url, pool_pre_ping=True)💡
pydantic-settingsmatcheaDATABASE_URL(mayúsculas, en el.env) condatabase_url(minúsculas, en la claseSettings) automáticamente — por defecto no distingue mayúsculas/minúsculas entre el nombre de la variable de entorno y el campo.
🧪 Tip de entrevista: ¿Por qué no hardcodear la URL de la base de datos en el código? Porque cambia entre entornos (tu Mac en desarrollo, un servidor en producción) y puede contener credenciales — el
.envmantiene esos valores fuera del código fuente (y fuera de git).
📎 Relacionado
- [[pip-command-not-found-venv-inactivo]]