Sobre el proyecto

QueryAPIGate es un servicio Flask autoalojado y único que ejecuta SQL contra tus bases de datos y devuelve resultados en JSON, NDJSON, XML, YAML, CSV, TSV o Excel. Guarda una consulta una vez y se convierte en un endpoint REST versionado con parámetros tipados y seguros contra inyección, e historial de ejecución, sin escribir controladores, capas de repositorio, paginación, autenticación o serialización repetitiva. El soporte multi-base de datos incluye controladores nativos para MySQL, PostgreSQL, ClickHouse, SQLite, H2 y DuckDB, además de JDBC genérico para cualquier cosa con un jar de controlador (Oracle, SQL Server, DB2, Snowflake, etc.). La misma protección SQL, agrupación de conexiones, enlace de parámetros y formatos de salida se aplican independientemente de la base de datos subyacente. Características de seguridad y control de acceso: - Autenticación por clave API con almacenamiento de claves con hash SHA-256. - Contraseñas de conexión a bases de datos cifradas en reposo mediante QUERYAPIGATE_SECRET_KEY, descifradas solo en memoria al abrir una conexión. - Claves API con alcance: restringe una clave a conexiones específicas y/o a una lista de permitidos de consultas guardadas; el acceso de escritura está desactivado salvo que se habilite explícitamente. - Colecciones: agrupa consultas guardadas y concede a una clave un grupo completo; mover una consulta muestra qué claves ganan o pierden acceso. - Roles de permisos con nombre: plantillas reutilizables copiadas en una clave al crearla. - Caducidad de clave API, revocación, límite de tasa por clave y lista de permitidos por IP (rangos CIDR). - Protección SQL que permite solo sentencias SELECT/WITH/SHOW/DESCRIBE/EXPLAIN individuales por defecto, con parámetros vinculados :name. Las consultas guardadas están versionadas: guardar con el mismo nombre crea una nueva versión en lugar de sobrescribir, y ?version=1 sigue ejecutando la anterior. Los parámetros pueden declarar tipo, valor por defecto, obligatorio/opcional, enumeración, rango numérico, longitud y patrón; la entrada inválida se rechaza con un 400 campo por campo antes de llegar a la base de datos. Los formatos de respuesta (JSON, NDJSON, XML, YAML, CSV, TSV, XLSX) son seleccionables por solicitud mediante ?format=. La paginación usa ?page y ?page_size con una cabecera X-Has-More. Para exportaciones completas, ?stream=true transmite el resultado completo desde el cursor de la base de datos en lugar de almacenarlo en búfer, verificado con resultados de 1,000,000 de filas y memoria plana del servidor en MySQL, PostgreSQL y ClickHouse. Un comando CLI (queryapigate export) envuelve la misma ruta de transmisión para uso con cron/systemd/Kubernetes CronJob. El caché de consultas admite cache_ttl, Cache-Control, ETag, solicitudes condicionales, 304 Not Modified y una cabecera X-Cache HIT/MISS; nunca se aplica a escrituras. La limitación de tasa combina un límite global por IP con un límite opcional independiente por clave. La observabilidad incluye registros JSON estructurados etiquetados con IDs de solicitud, tiempos de ejecución por consulta, advertencias de consultas lentas y métricas Prometheus en /metrics que cubren recuentos de solicitudes/consultas, latencias, ocupación del grupo de conexiones y rechazos por límite de tasa. Se incluye un panel de Grafana empaquetado para métricas históricas. OpenAPI 3.0 se genera en /openapi.json (validado en CI contra el validador oficial) con cada consulta guardada como endpoint tipado; /docs sirve Swagger UI, filtrado a lo que cada clave puede alcanzar. La interfaz de administración integrada en /ui cubre gestión de conexiones, editor SQL con resaltado de sintaxis y exploración de esquemas, ejecución/vista previa de consultas, EXPLAIN, gestión de consultas guardadas y versiones, gestión de claves API, registro de auditoría de cambios administrativos, historial de ejecución por consulta, inspección de respuestas con árboles JSON plegables, gráficos de barras rápidos para resultados numéricos y copia con un clic como curl/TSV. Una pantalla de Configuración de solo lectura muestra cada variable de entorno y su valor efectivo, con secretos reportados solo como configurados o no. La instalación es mediante pip con extras de controladores opcionales (mysql, postgres, clickhouse, h2, duckdb, all, encryption). SQLite y DuckDB no necesitan runtime externo; H2 y JDBC genérico requieren un runtime Java. También se admite Docker. El comando `queryapigate examples load` instala cuatro escenarios de ejemplo trabajados (API de informes, datos de panel, exportación en streaming, integración de socios) como colecciones, consultas, roles y claves API listas para usar. Las pruebas incluyen pruebas unitarias, pruebas de integración contra servidores MySQL, PostgreSQL, ClickHouse y H2 reales en CI, pruebas de integración DuckDB, pruebas fuzz de protección SQL con Hypothesis, verificación de tipos estática con mypy, linting con ruff y CI en cada push. El proyecto está licenciado bajo FSL-1.1-MIT y requiere Python 3.9+.