Aplicación web que permite cargar dumps de bases de datos MySQL y realizar consultas en lenguaje natural usando Claude AI.
📝 ¿Por qué solo se ejecutan
SELECTy cómo se valida la query antes de tocar la base? Lo cuento acá: Chat-SQL: de lenguaje natural a SQL, sin abrir la base de par en par.
- Docker y Docker Compose instalados
- API Key de Claude (Anthropic)
- Clonar el proyecto
git clone git@github.com:walteru/Chat-SQL.git
cd Chat-SQL- Iniciar la aplicación
make start- Abrir en navegador
http://localhost:8080
- Ingresa tu Claude API Key (sk-ant-api03-...)
- Selecciona tu archivo dump.sql
- Haz clic en "Cargar Base de Datos"
Una vez cargada la base de datos:
- Escribe consultas en lenguaje natural
- Ejemplo: "Muestra todos los usuarios activos"
- La IA convertirá tu pregunta a SQL y ejecutará la consulta
- Solo se ejecutan consultas SELECT: se valida que sea una única sentencia
SELECT (se rechazan sentencias apiladas tipo
SELECT 1; DROP TABLE ..., losSELECT ... INTO OUTFILE/DUMPFILE, y cualquier comentario SQL/* */ -- #—que MySQL trata como espacio y permitiría ofuscar keywords—), y además la query del chat corre en una conexión conmultipleStatements: falseque rechaza varias sentencias a nivel del driver. Verbackend/sqlGuard.js(con tests enbackend/sqlGuard.test.js).Nota: por seguridad la validación es conservadora; rechaza la query aunque el comentario o el texto
into outfileaparezcan dentro de un string literal. - Tu API key no se guarda en el servidor
- Los datos se procesan localmente en Docker
Endurecimiento opcional recomendado para entornos sensibles: usar un usuario MySQL con permisos
SELECTúnicamente para las consultas del chat (defensa en profundidad sobre la validación).
make start # Iniciar todos los servicios
make stop # Detener servicios
make restart # Reiniciar servicios
make logs # Ver logs en tiempo real
make status # Ver estado de contenedores
make clean # Limpiar todo (contenedores, volúmenes)
make test # Probar conectividad- Frontend: HTML/CSS/JavaScript (host 8080)
- Backend: Node.js + Express (host 3001 → 3000 interno)
- Base de datos: MySQL 8.0 (host 3307 → 3306 interno)
- Proxy: Nginx
Normalmente solo necesitás el frontend en
http://localhost:8080; Nginx hace de proxy hacia el backend. Los puertos de backend y MySQL se exponen al host solo para depuración.
make dev-logs-backend # Solo backend
make dev-logs-mysql # Solo MySQLmake dev-shell-backend # Shell del backend
make dev-shell-mysql # MySQL CLI| Servicio | Puerto host | Puerto interno | URL |
|---|---|---|---|
| Frontend | 8080 | 80 | http://localhost:8080 |
| Backend API | 3001 | 3000 | http://localhost:3001 |
| MySQL | 3307 | 3306 | mysql://localhost:3307 |
- API Key se maneja solo en frontend
- Validación de consultas SQL
- Solo queries SELECT permitidas
- Límites de tamaño de archivo (500MB)
- Timeout en consultas
sql-chat-app/
├── docker-compose.yml # Configuración Docker
├── Makefile # Comandos de gestión
├── nginx.conf # Configuración proxy
├── backend/ # API Node.js
│ ├── Dockerfile
│ ├── server.js
│ └── package.json
├── frontend/ # Interfaz web
│ ├── index.html
│ ├── css/styles.css
│ └── js/app.js
└── uploads/ # Archivos temporales
make clean && make build && make startsudo chown -R $USER:$USER uploads/make dev-logs-mysql
# Esperar que aparezca "ready for connections"- Verifica que empiece con
sk-ant-api03- - Comprueba en https://console.anthropic.com/
- Compatible con Windows y Linux
- Archivos SQL hasta 500MB
- Resultados limitados a 100 filas por consulta
- Sesión temporal (se pierde al recargar página)
Si encuentras problemas:
- Revisa los logs:
make logs - Verifica el estado:
make status - Reinicia:
make restart