sqlite-utils 4.0: наконец-то миграции схемы для SQLite — и это работает
Саймон Уиллисон выпустил sqlite-utils 4.0 — это первый мажорный релиз утилиты с ноября 2020-го. Главное нововведение — встроенная система миграций схемы базы данных, которая отслеживает, какие миграции уже применены, и автоматически применяет ожидающие.
Миграции задаются в Python-файлах через класс Migrations и декоратор @migrations(). Внутри они используют метод table.transform() — это обёртка над классическим паттерном из документации SQLite: создаётся временная таблица с новой схемой, в неё копируются данные, потом старая таблица удаляется, а временная переименовывается. Так можно менять типы колонок и добавлять поля — то, что не умеет обычный ALTER TABLE.
Утилита также получила поддержку вложенных транзакций через db.atomic() и составных внешних ключей. Команда uvx sqlite-utils migrate data.db migrations.py --list показывает статус всех миграций. А если не указать файл, то sqlite-utils просканирует текущую директорию в поисках migrations.py.
Сам Уиллисон уже несколько лет использует похожую систему в своём инструменте LLM, а за вдохновение благодарит джанговские миграции от Эндрю Годвина и Саут. Его собственный старый проект dmigrations остался в 2008 году на первом DjangoCon.