sqlite-utils 4.1: inserciones por código, control de tipos y manejo de tablas STRICT

La versión 4.1 de sqlite-utils introduce varias mejoras prácticas: ahora pueden generarse filas con snippets de Python desde la línea de comandos, es posible forzar tipos de columna al crear tablas, y hay nuevas opciones para índices y tablas en modo STRICT. Estas novedades facilitan flujos ETL ligeros y la transición entre modos de tabla en SQLite.

Por Redaccion TD
sqlite-utils 4.1: inserciones por código, control de tipos y manejo de tablas STRICT

Qué trae sqlite-utils 4.1

sqlite-utils 4.1 es un lanzamiento puntual (dot-release) que agrega varias mejoras pequeñas pero útiles para quienes usan SQLite como almacén ligero de datos, especialmente en flujos ETL, proyectos de periodismo de datos, startups y equipos técnicos con recursos limitados.

Las novedades más destacadas cubren: la posibilidad de proporcionar bloques de código Python desde la CLI para generar filas, la opción de forzar tipos de columna al crear tablas, comandos para gestionar índices, lectura de consultas desde stdin y herramientas para cambiar el modo STRICT de tablas SQLite.

Generar filas desde la CLI con —code

Una de las adiciones más prácticas es que los comandos sqlite-utils insert y sqlite-utils upsert ahora aceptan la opción --code. Con ella pueden pasarse bloques de Python (o la ruta a un archivo .py) que definen una función rows() o un iterable rows que produzca los registros a insertar.

Esto extiende una pauta ya presente en otras partes de la herramienta (por ejemplo sqlite-utils convert) y evita tener que crear un módulo Python separado solo para una operación puntual. Un ejemplo de uso:

sqlite-utils insert data.db creatures --code 'def rows():\n    yield {"id": 1, "name": "Cleo"}\n    yield {"id": 2, "name": "Suna"}' --pk id

Este enfoque es ideal cuando están ejecutando transformaciones rápidas en una laptop, preparando datos para una visualización o limpiando CSVs antes de subirlos a un repositorio. Para equipos en América Latina, donde muchas veces los procesos de ingestión son ad-hoc sobre archivos enviados por gobiernos o instituciones, poder incrustar lógica de transformación en una sola línea acelera la iteración.

Forzar el tipo de columna con —type

Otro aporte menor pero muy práctico es la opción --type column-name type para insert y upsert. Permite anular el tipo que sqlite-utils elegiría automáticamente al crear una tabla.

Esto es especialmente útil con columnas que parecen numéricas pero deben tratarse como texto: códigos postales, números de identificación fiscal, teléfonos o cualquier identificador con ceros a la izquierda. Por ejemplo, muchos CSV de gobiernos muestran códigos postales como números, y sin cuidado se pierden los ceros iniciales.

Con --type pueden declarar explícitamente que una columna debe ser TEXT, evitando pérdidas de precisión en datos que, aunque numéricos en apariencia, son identificadores.

Gestionar índices: drop-index y table.drop_index()

sqlite-utils 4.1 agrega un método table.drop_index(name) en la API y el comando sqlite-utils drop-index en la CLI para eliminar un índice por nombre. Ambos aceptan ignore=True o --ignore para ignorar si el índice no existe.

Esto ayuda a automatizar tareas de mantenimiento o despliegue donde no siempre se conoce el estado exacto de la base de datos objetivo, evitando fallos por índices ausentes.

Leer consultas desde stdin

Pequeña pero útil: sqlite-utils query ahora puede leer la consulta SQL desde la entrada estándar si se pasa - en lugar de la consulta. Un uso típico sería:

echo "select * from dogs" | sqlite-utils query dogs.db -

Esto facilita encadenar comandos en scripts y pipelines, integrando filtros o transformaciones generadas por otras herramientas.

Inferencia de clave primaria para upsert

Otra mejora derivada de revisar incidencias con ayuda de herramientas de inteligencia artificial (mencionada en el registro del proyecto) es que sqlite-utils upsert ahora puede inferir la clave primaria de una tabla existente. En tablas que ya tienen definida una primary key, ya no es necesario pasar --pk explícitamente.

Esto simplifica comandos habituales al sincronizar datos con tablas preexistentes, reduciendo fricción en flujos donde la estructura de la base de datos ya está establecida.

Cambiar entre tablas STRICT y no-STRICT

SQLite introdujo el modo STRICT para dar mayor control sobre tipos y validación. Sin embargo, como señaló Evan Hahn (y recoge este lanzamiento), no existe una instrucción ALTER TABLE para convertir directamente una tabla no-STRICT a STRICT o viceversa: hay que copiar los datos a una nueva tabla con la definición deseada.

sqlite-utils ya tenía una herramienta de transformación que recrea tablas y copia datos; en 4.1 se extendió para aceptar strict=True o strict=False en table.transform() y table.transform_sql(), y en la CLI los flags --strict y --no-strict para sqlite-utils transform.

Esto permite migrar tablas entre modos sin escribir scripts manuales de exportación/importación. Para equipos que buscan aplicar políticas de tipo más estrictas en producción —por ejemplo, para reducir errores al insertar registros desde múltiples fuentes— la función es muy práctica.

Cómo se desarrollaron estas mejoras (uso de modelos de IA)

El autor del proyecto menciona que utilizó una revisión de issues con Codex y un transcript de “GPT-5.6 Sol xhigh Codex” para identificar tareas sencillas y, en particular, para diseñar e implementar las mejoras relacionadas con tablas STRICT. Un prompt que resultó valioso fue pedir al modelo que ejecutara manualmente pruebas cortas con uv run python -c para ejercitar la nueva opción .transform(strict=) y detectar posibles edge cases. Ese proceso detectó dos problemas menores que se corrigieron.

No se trata de una sustitución del control de calidad humano, pero el uso de estas herramientas ayudó a acelerar la identificación de casos límite durante el desarrollo.

¿Por qué importa para equipos en América Latina?

  • Flexibilidad en ETL: Poder incrustar pequeños scripts Python directamente en la CLI reduce la necesidad de infraestructuras complejas para pipelines sencillos.
  • Calidad de datos: Forzar el tipo de columnas evita errores comunes con códigos postales, identificadores y otros campos que no deben normalizarse como números.
  • Mantenimiento más seguro: comandos para manejar índices con tolerancia a errores y la capacidad de cambiar el modo STRICT facilitan operaciones de migración y endurecimiento de esquemas.

Para periodistas de datos, equipos gubernamentales o startups que trabajan con archivos CSV y necesitan iterar rápido, estas mejoras reducen fricción y mejoran la reproducibilidad de procesos.

Conclusión

sqlite-utils 4.1 no es una revolución, pero suma varias mejoras prácticas que agilizan tareas diarias: inyección de código para generar filas, control explícito de tipos, gestión de índices, lectura de consultas desde stdin, inferencia de claves primarias en upserts y soporte para migrar tablas entre modos STRICT y no-STRICT.

Si ya usan sqlite-utils en sus flujos de trabajo, la actualización permitirá ahorrar líneas de código y evitar errores comunes en la manipulación de datos. Para quienes aún no lo usan, esta versión refuerza la propuesta de valor de sqlite-utils como una herramienta ligera y poderosa para gestionar datos en SQLite desde la línea de comandos o scripts simples.

Fuente original: Simon Willison