Python SDK
La clase LensClient proporciona acceso programatico a todas las capacidades de Lens desde codigo Python. Se conecta a tus buckets registrados, monta vistas DuckDB y expone operaciones de consulta, IA y cache como llamadas a metodos.
Importar
Sección titulada «Importar»from dataspoc_lens import LensClientUso basico
Sección titulada «Uso basico»from dataspoc_lens import LensClient
client = LensClient()
# List tablestables = client.tables()print(tables) # ['customers', 'orders', 'products']
# Run a queryresult = client.query("SELECT COUNT(*) as total FROM orders")print(result["rows"]) # [[48680]]
# Clean upclient.close()Context manager
Sección titulada «Context manager»Usa LensClient como context manager para asegurar que la conexion se cierre automaticamente:
from dataspoc_lens import LensClient
with LensClient() as client: tables = client.tables() result = client.query("SELECT * FROM orders LIMIT 5") print(result["columns"]) print(result["rows"])Metodos
Sección titulada «Metodos»tables()
Sección titulada «tables()»Retorna la lista de nombres de tablas montadas.
tables = client.tables()# ['customers', 'orders', 'products']Retorna: list[str]
schema(table)
Sección titulada «schema(table)»Retorna metadatos de columnas para una tabla.
columns = client.schema("orders")# [# {"column_name": "order_id", "data_type": "INTEGER"},# {"column_name": "customer_id", "data_type": "INTEGER"},# {"column_name": "order_date", "data_type": "DATE"},# {"column_name": "total", "data_type": "DOUBLE"},# {"column_name": "status", "data_type": "VARCHAR"},# ]Parametros: table (str) — nombre de la tabla
Retorna: list[dict] — cada dict tiene column_name y data_type
query(sql)
Sección titulada «query(sql)»Ejecuta una consulta SQL y retorna los resultados.
result = client.query("SELECT status, COUNT(*) as cnt FROM orders GROUP BY status")print(result["columns"]) # ['status', 'cnt']print(result["rows"]) # [['completed', 32100], ['pending', 8450], ...]print(result["row_count"]) # 3print(result["duration"]) # 0.089Parametros: sql (str) — consulta SQL a ejecutar
Retorna: dict con claves:
columns— lista de nombres de columnasrows— lista de listas de filasrow_count— numero de filas retornadasduration— tiempo de consulta en segundos
ask(question, **kwargs)
Sección titulada «ask(question, **kwargs)»Traduce una pregunta en lenguaje natural a SQL, la ejecuta y retorna el resultado.
result = client.ask("What are the top 5 customers by spending?")print(result["sql"]) # 'SELECT c.name, SUM(o.total) ...'print(result["columns"]) # ['name', 'total_spent']print(result["rows"]) # [['Alice Smith', 15420.5], ...]print(result["error"]) # NoneParametros:
question(str) — pregunta en lenguaje natural**kwargs— reenviados al modulo de IA (ej.,provider,api_key,model,debug)
Retorna: dict con claves:
sql— consulta SQL generadacolumns— lista de nombres de columnasrows— lista de listas de filasduration— tiempo total en segundoserror— mensaje de error oNone
cache_status()
Sección titulada «cache_status()»Retorna metadatos de todas las tablas cacheadas.
cached = client.cache_status()# [# {# "table": "orders",# "status": "fresh",# "cached_at": "2026-04-15T10:30:00",# "size_bytes": 12902400,# }# ]Retorna: list[dict] — cada dict tiene table, status, cached_at, size_bytes
cache_refresh(table)
Sección titulada «cache_refresh(table)»Fuerza la actualizacion del cache local para una tabla.
info = client.cache_refresh("orders")print(info)# {"cached_at": "2026-04-15T14:00:00", "size_bytes": 12902400, "file_count": 4}Parametros: table (str) — nombre de la tabla
Retorna: dict con cached_at, size_bytes, file_count
Lanza: ValueError si la tabla no se encuentra en ningun bucket registrado.
cache_refresh_stale()
Sección titulada «cache_refresh_stale()»Actualiza todas las tablas con cache desactualizado.
refreshed = client.cache_refresh_stale()# [{"table": "customers", "cached_at": "...", "size_bytes": 2200000, "file_count": 1}]Retorna: list[dict] — una entrada por tabla actualizada
cache_clear(table=None)
Sección titulada «cache_clear(table=None)»Limpia los datos cacheados. Si se proporciona table, solo esa tabla se limpia. De lo contrario se eliminan todos los caches.
# Clear specific tablecleared = client.cache_clear("orders")# ['orders']
# Clear allcleared = client.cache_clear()# ['orders', 'customers', 'products']Parametros: table (str | None) — nombre opcional de la tabla
Retorna: list[str] — nombres de las tablas limpiadas
close()
Sección titulada «close()»Cierra la conexion DuckDB subyacente.
client.close()Se llama automaticamente al usar el context manager.
Ejemplo completo
Sección titulada «Ejemplo completo»from dataspoc_lens import LensClient
with LensClient() as client: # Explore for table in client.tables(): cols = client.schema(table) print(f"{table}: {len(cols)} columns")
# Query result = client.query(""" SELECT c.name, COUNT(o.order_id) as orders, SUM(o.total) as revenue FROM customers c JOIN orders o ON c.id = o.customer_id GROUP BY c.name ORDER BY revenue DESC LIMIT 10 """)
for row in result["rows"]: print(f"{row[0]}: {row[2]:,.2f}")
# AI answer = client.ask("Which product category has the highest return rate?") if answer["error"] is None: print(f"SQL: {answer['sql']}") for row in answer["rows"]: print(row)
# Cache management client.cache_refresh("orders") status = client.cache_status() for entry in status: print(f"{entry['table']}: {entry['status']}")