sqlite-utils 4.0rc1: миграции и вложенные транзакции
sqlite-utils, Python-библиотека и CLI для работы с SQLite, предоставляющая высокоуровневые операции над БД. Версия 4.0rc1 добавляет две крупные фичи: систему миграций (портированную из отдельного пакета sqlite-migrate) и API для вложенных транзакций через savepoints. Релиз содержит несколько breaking changes: изменен тип FLOAT на REAL, изменилась логика вставки данных, переход на pyproject.toml, новая синтаксис INSERT ... ON CONFLICT для всех версий SQLite после 3.23.1.
Ключевые факты
- Встроенная система миграций на основе декораторов с поддержкой применения через Python API или CLI
- Новый API db.atomic() для управления вложенными транзакциями через savepoints, заимствованный из Django
- Несколько breaking changes: FLOAT→REAL, новая синтаксис вставки данных, отказ от Python 3.8, перенос TUI в отдельный плагин
- Миграции спроектированы без функции отката, ошибки исправляются новой миграцией вперед
- Тестирование на SQLite 3.23.1 (2018 год) гарантирует совместимость со старыми версиями
Почему это важно
Миграции БД, стандартный паттерн в production. Раньше sqlite-utils оставлял управление транзакциями пользователю. Теперь версия 4.0 интегрирует проверенный механизм миграций (предшественник использовался LLM и другими проектами годы) и упрощает работу с транзакциями через savepoints. Breaking changes говорят об амбициях авторов переделать фундамент для лучшей совместимости с SQL-стандартами.
Кому это важно
Python-разработчикам, работающим с SQLite через ORM или прямым доступом. Особенно полезно для небольших приложений и скриптов, где полноценные системы миграций (как Django) кажутся избыточны. LLM-проектам, которые используют SQLite как встроенное хранилище, упростится управление схемой.
Как это применить
Миграции подключаются через декоратор @migrations() в файле migrations.py. Каждая функция получает объект Database и может создавать таблицы или менять схему. Запуск: либо db = Database(...); migrations.apply(db) в Python, либо команда sqlite-utils migrate creatures.db migrations.py в CLI. Вложенные транзакции используют with db.atomic(): контекст, внутри можно еще раз вложить db.atomic() для savepoint. Установка: pip install sqlite-utils==4.0rc1 или uvx --with sqlite-utils==4.0rc1.
Можно ли доверять
Дизайн миграций проверен годами (из sqlite-migrate). Неподвижно реализован в sqlite-utils 4.0 RC, это первый стабильный кандидат перед финальным выпуском. Вложенные транзакции, абстракция над SQLite savepoints, стандартного механизма, но меньше тестирована. Авторы (Simon Willison) активно просят обратную связь через Discord и GitHub Issues перед финальным релизом.
Риски и подводные камни
Breaking changes потребуют правок в коде существующих приложений. Миграции без отката означают, что ошибку нужно исправлять новой миграцией (forward-only). Вложенные транзакции могут дорого обойтись на больших объемах, savepoints во время интенсивных операций замедляют работу. Отказ от Python 3.8 отсечет старые окружения. Изменение синтаксиса имен столбцов с [square-braces] на "double-quotes" может сломать скрипты, зависящие от точной схемы.
«The system is deliberately small: it doesn't provide reverse migrations, so any mistakes you make should be fixed by deploying a fresh migration to undo them.»
— Simon Willison, sqlite-utils документация