Simon Willison ha rilasciato sqlite-utils 4.0, la 124esima release del progetto e il primo salto di major version dalla 3.0 di novembre 2020. sqlite-utils è una utility CLI e una libreria Python per manipolare database SQLite, molto usata nell’ecosistema Datasette e LLM dello stesso autore. Oltre ad alcune breaking change minori (che giustificano il cambio di major), la versione porta tre funzionalità principali: le database migration, le transazioni annidate tramite il nuovo metodo db.atomic() e il supporto alle compound foreign key.
Migrazioni di schema
Le migration definiscono una sequenza di modifiche da applicare a un database SQLite, insieme a un meccanismo per tenere traccia di quali sono già state applicate. Si scrivono in file Python e sfruttano il metodo table.transform(), che offre capacità di alter table più avanzate di quelle native di SQLite seguendo il pattern raccomandato dalla documentazione ufficiale: creare una tabella temporanea con il nuovo schema, copiare i dati, eliminare la vecchia e rinominare. Una tabella _sqlite_migrations registra le migration eseguite. Il comando sqlite-utils migrate le applica, e senza un file specifico effettua lo scan della directory corrente cercando file migrations.py.
Il design non è nuovo: nasce dal pacchetto separato sqlite-migrate, rimasto in beta per tre anni e ora promosso a feature integrata. Rispetto alle Migrations di Django, l’approccio è deliberatamente più semplice: niente generazione automatica dal modello (sqlite-utils incoraggia la creazione programmatica delle tabelle) e niente rollback, che secondo l’autore è raramente usato e in SQLite si ottiene copiando il file del database prima di applicare le migration.
Transazioni, foreign key e breaking change
Il context manager db.atomic() introduce le transazioni annidate sfruttando i savepoint di SQLite, rendendo il sistema di migration più sicuro. Le compound foreign key sono supportate in creazione, trasformazione e introspezione. Tra le breaking change: gli upsert usano ora la sintassi INSERT ... ON CONFLICT ... DO UPDATE SET, db.query() esegue subito e rifiuta gli statement che non restituiscono righe (per le scritture e il DDL va usato db.execute()), e gli import CSV/TSV rilevano i tipi di colonna per default.
- Prima major release dal 2020, con guida ufficiale all’upgrade da 3.x a 4.0.
- I progetti che dipendono da
sqlite-migratecontinuano a funzionare senza modifiche. - L’autore documenta un uso estensivo di modelli frontier per rivedere il codice e scrivere release notes e upgrade guide, poi verificate manualmente.
Fonte: Release: sqlite-utils 4.0 — https://simonwillison.net/2026/Jul/7/sqlite-utils/
Hai qualcosa da aggiungere? Unisciti alla discussione.