
← Sospechosos habitualesanteayer · 27 min
ATA 840 sqlite-utils, tu navaja suiza para SQLite
<p>Llevo varias semanas construyendo un grafo de conocimiento con GraphRAG sobre SQLite, y en ese día a día me he topado con <b>sqlite-utils</b>, una herramienta que se ha convertido en mi navaja suiza para trabajar con bases de datos SQLite sin complicarme la vida. Es de esas utilidades que no sabías que necesitabas hasta que la pruebas.</p><p>Te preguntarás por qué SQLite y no PostgreSQL o cualquier solución más seria. La respuesta es sencilla, porque necesito algo que quepa en mi equipo, que sea portátil y que pueda llevarme en un USB sin montar un servidor. Todo tu conocimiento, en un solo archivo que abres donde quieras.</p><p>El problema de siempre ha sido inspeccionar esas bases. Abrir DBeaver o tirar de Python solo para mirar qué hay dentro da una pereza enorme, y al final acabas dejándolo. <b>sqlite-utils</b>, creada por Simon Willison, resuelve justo eso, y te permite consultar, filtrar, transformar y exportar sin escribir una línea de SQL ni de Python.</p><p>Para que te hagas una idea, aquí hay dos cosas en una sola herramienta, una utilidad de línea de comandos y una librería de Python que no pretende ser un ORM. Nació dentro del ecosistema de <b>Datasette</b>, y busca que crear una base desde cero y poblarla con datos sea rápido y sin fricción. En mi caso ha acabado sustituyendo a los comandos sueltos de <i>sqlite3</i> que tenía repartidos por las notas.</p><p>Otro terreno donde se nota la mano es la ingesta. Con <b>insert</b> metes un JSON que llega por la tubería, un CSV de los que exportas de cualquier sitio, o la respuesta de una API con un <i>curl</i> delante. Con <b>upsert</b> y <b>bulk</b> actualizas registros que ya existían o metes miles de filas de golpe, y todo eso se encadena con <b>jq</b> en una sola tubería.</p><p>Luego está la parte de cambiar las cosas sin dolor, renombrar una columna, borrar la que sobra o cambiar un tipo de dato. En SQL puro eso es un baile de <i>create table</i>, copiar los datos y borrar la tabla vieja, con el riesgo de liarla a mitad de camino. Aquí es un <b>transform</b>, se ejecuta dentro de una transacción y el esquema queda reescrito como si lo hubieras diseñado así desde el principio.</p><p>En este episodio te cuento cómo instalarla con <i>uv</i>, cómo explorar tablas y esquemas, cómo navegar los datos con <b>rows</b>, cómo filtrar de forma segura con parámetros con nombre y cómo montar consultas complejas con joins. Además verás el combo que más me ha enganchado, <b>sqlite-utils</b> encadenado con <b