sql-cloud-warehouse
Skill0 starsChanged 41 days agoMITView on GitHub
Conecta el toolkit a Snowflake, BigQuery, Redshift o Databricks (Spark SQL) via SQLAlchemy + driver oficial, con snippets SQL dialecto-aware (DATE_TRUNC, IFF/IF/CASE, TRY_CAST/SAFE_CAST). Usese cuando el `sql-analyst` reciba un target cloud en vez de SQLite/Postgres/MySQL/DuckDB local. Solo lectura (SELECT); INSERT/UPDATE/DDL quedan fuera de scope v1. Las deps cloud (snowflake-connector-python, sqlalchemy-bigquery, sqlalchemy-redshift, databricks-sql-connector) son peerDeps OPCIONALES — la skill emite error accionable con `pip install` si faltan.
- Reads credentials
- Installs packages
In this repository24 other files it gives its agents.
- AGENTS.mdAGENTS.md
- ab-testing-analysisSkill
- api-builderSkill
- audit-logSkill
- cohort-retentionSkill
- csv-profilerSkill
- customer-segmentationSkill
- data-quality-contractsSkill
- excel-formulasSkill
- excel-profilerSkill
- feature-engineeringSkill
- insight-synthesisSkill
- ml-modelingSkill
- model-evaluationSkill
- pandas-cleaningSkill
- query-validationSkill
- report-exportSkill
- schema-mapperSkill
- sql-query-helperSkill
- sql-writeSkill
- statistical-testingSkill
- time-series-patternsSkill
- using-data-analytics-agentsSkill
- viz-patternsSkill
The file
Files
SQL Cloud Warehouse
Apunta el flujo de sql-analyst a un data warehouse o lakehouse cloud
(Snowflake, BigQuery, Redshift, Databricks) usando las mismas credenciales
que ya pasaste via .env o vault.
Descripcion general
A diferencia de sql-analyst (que apunta a SQLite/Postgres/MySQL/DuckDB
locales), esta skill:
- Construye un SQLAlchemy Engine apuntando al warehouse cloud.
- Provee snippets SQL que saben la diferencia entre los dialectos
(ej. Snowflake usa
IFF(cond, a, b), BigQuery y Databricks usanIF(...), Redshift usaCASE WHEN— el toolkit NO mezcla sintaxis). - Mantiene la misma forma de output que
schema-mapperpara que el resto del flujo (query → validate) funcione igual. - Solo lectura: SELECT unicamente. INSERT/UPDATE/DDL quedan
explicitamente fuera de scope v1 (para persistencia con guardrails, usar
sql-write).
Cuando usar
Invocar esta skill cuando el pedido matchee con alguno de:
- "Tengo un proyecto Snowflake / BigQuery / Redshift / Databricks con N tablas. Dame el top 10 clientes por revenue."
- "Conectate a este warehouse o lakehouse y mapéame el schema."
- "Escribime esta query en dialecto BigQuery (con backticks y SAFE_CAST) o Databricks (Spark SQL)."
- "Validá que esta query no escanee más de 1TB antes de correrla."
No invocar cuando:
- El target es SQLite/Postgres/MySQL/DuckDB local →
sql-analystsolo. - El usuario quiere escribir datos (INSERT/UPDATE/CREATE TABLE) → usar
sql-write.
Flujo de trabajo
- Detectar el target: leer
WAREHOUSE_TYPEde env (snowflake|bigquery|redshift|databricks). Si no esta, inferir del connection string o pedir al usuario explicitamente. - Verificar credenciales y construir el Engine SQLAlchemy:
- Snowflake:
SNOWFLAKE_ACCOUNT/USER/PASSWORD/WAREHOUSE/DATABASE(opcionalSNOWFLAKE_SCHEMA). - BigQuery:
WAREHOUSE_PROJECT+WAREHOUSE_DATASET(oGOOGLE_APPLICATION_CREDENTIALSapuntando al JSON de service account). - Redshift:
REDSHIFT_HOST/PORT/USER/PASSWORD/DATABASE. - Databricks:
DATABRICKS_SERVER_HOSTNAME/HTTP_PATH/TOKEN(opcionalDATABRICKS_CATALOG/SCHEMA).
- Snowflake:
- Test de conexion: ejecutar
SELECT 1para validar que el engine responde antes de seguir. Si falla, mensaje accionable especificando que env var o dep falta. - Introspeccionar schema:
introspect_schema(engine, schema=...)devuelve{warehouse, schema, tables: {<table>: {columns: [...]}}}en el mismo formato queschema-mapper. - Seleccionar tablas candidatas + JOIN paths: aplicar la heuristica
del
schema-mapperexistente sobre el output del paso 4. - Escribir query dialecto-aware usando los snippets de
dialect_snippets.py(ver tabla de diferencias abajo). - Validar query con
validate_query(query)(estatico: parentesis balanceados, comillas) yexplain_query(engine, query)cuando el warehouse lo soporte (Snowflake/Redshift; BigQuery requiere cliente nativo). - Ejecutar query con
engine.connect()+pd.read_sql(). Output en DataFrame pandas + metadata (bytes scanned para BigQuery, credits para Snowflake) cuando aplique.
Recetas pre-aprobadas (importables)
import sys
sys.path.insert(0, "ruta/al/repo")
from skills_loader import load_skill_packages
load_skill_packages("skills")
from sql_cloud_warehouse.recetas import (
connect_warehouse, test_connection,
introspect_schema,
date_trunc, conditional, current_timestamp, safe_cast,
validate_query, explain_query,
MissingCredentialsError, MissingDependencyError,
)Las recetas son funciones puras (sin estado) y la mayoria NO requiere conexion activa (los snippets dialecto-aware son solo strings). La introspeccion y los connects requieren driver instalado + credenciales validas.
Diferencias de sintaxis clave
| Concepto | Snowflake | BigQuery | Redshift | Databricks (Spark SQL) |
| Condicional | IFF(cond, a, b) | IF(cond, a, b) | CASE WHEN cond THEN a ELSE b END | IF(cond, a, b) |
| Truncar fecha | DATE_TRUNC('month', col) | DATE_TRUNC(col, MONTH) | DATE_TRUNC('month', col) | DATE_TRUNC('month', col) |
| Cast seguro | TRY_CAST(x AS TYPE) | SAFE_CAST(x AS TYPE) | TRY_CAST(x AS TYPE) | TRY_CAST(x AS TYPE) |
| Current ts | CURRENT_TIMESTAMP() | CURRENT_TIMESTAMP() | GETDATE() | CURRENT_TIMESTAMP() |
| LIMIT | LIMIT n | LIMIT n | LIMIT n | LIMIT n |
| Identificadores | comillas dobles | backticks | comillas dobles | backticks |
dialect_snippets.py encapsula las 4 primeras en funciones puras. Usa
esas funciones SIEMPRE que armes una query — el riesgo real es
copiar-pegar una query de StackOverflow en dialecto equivocado y
gastar credits del warehouse antes de descubrir el error.
Credenciales
- Sin secrets hardcodeados: las credenciales van en
.env(local) o en el vault de la empresa. Nunca en el codigo ni en el repo. - Variables requeridas (ver tabla arriba).
.env.exampleen este directorio documenta las variables por warehouse con placeholders (SNOWFLAKE_ACCOUNT=xxx,DATABRICKS_SERVER_HOSTNAME=xxx).- Service accounts (BigQuery): el JSON va en una ruta local, NO en
el repo. La env var
GOOGLE_APPLICATION_CREDENTIALSapunta al path.
Senales de alerta
MissingCredentialsError: el usuario no configuro las env vars. Mostrar el mensaje completo (lista que vars faltan) y donde van en.env.example.MissingDependencyError: el driver cloud no esta instalado. Mostrar el comandopip install ...exacto. NO intentar instalarlo tu mismo (peerDep opcional, el usuario decide).OperationalErrorcon "no such table" tras introspect: el schema pasado no existe en el warehouse. Listar los schemas disponibles conSHOW SCHEMAS(Snowflake) o equivalente.- Query corre OK pero devuelve 0 filas: chequea el filtro WHERE, el warehouse puede tener timezone distinto al local.
- Bytes scanned (BigQuery) > 100GB: warning automatico antes de cobrar.
Verificacion
Criterios de "listo" (ver docs/prd/sql-cloud-warehouse.md):
- Cada warehouse tiene un script de demo que falla con mensaje accionable si la credencial o la dep faltan.
make test-snowflake,make test-bigquery,make test-redshift,make test-databricksejecutan los demos (skipped por default si no hay credenciales).make test-sql-cloud-offlinecorre los snippets + validate sin necesitar credenciales (smoke test puro).- La skill esta en
skills/sql-cloud-warehouse/SKILL.mdcon el template de 6 secciones completo. AGENTS.mdactualizado:sql-analystcargasql-cloud-warehouseANTES desql-query-helpercuando target es uno de los cloud warehouses.package.json: las deps declaradas como peerDeps opcionales.bin/install.jscorre con auto-descubrimiento dinámico.
Dependencias
| Dep | Tipo | Tamano | Cuando se necesita |
sqlalchemy >= 2.0 | obligatoria | ~5 MB | siempre |
snowflake-connector-python | peerDep opcional | ~50 MB | solo si target=Snowflake |
sqlalchemy-bigquery + google-cloud-bigquery | peerDep opcional | ~30 MB | solo si target=BigQuery |
sqlalchemy-redshift + redshift-connector | peerDep opcional | ~20 MB | solo si target=Redshift |
databricks-sql-connector + databricks-sqlalchemy | peerDep opcional | ~25 MB | solo si target=Databricks |
El usuario instala solo la(s) que use. La skill falla con MissingDependencyError
y un pip install <paquete> accionable si no esta.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

