← На главную

sqlite-utils 4.0rc2: написан Claude Fable, транзакции с авто-коммитом

05.07.2026 06:19 · hackernews

Саймон Уиллисон выпустил вторую кандидатную версию sqlite-utils 4.0rc2. Большую часть кода для неё написал ИИ — модель Claude Fable от Anthropic. Всё обошлось примерно в $149.25.

Уиллисон решил проверить, сможет ли агент помочь довести релиз до стабильного состояния, пока у него ещё есть доступ к дорогой модели по подписке Claude Max ($200/месяц). Он запустил Claude Code с iPhone и попросил провести финальную ревизию перед стабильным релизом. Модель нашла серьёзные проблемы — пять «блокираторов релиза». Хуже всех был баг в delete_where(): метод никогда не фиксировал транзакцию, оставлял соединение в подвешенном состоянии, и все последующие записи в базу просто исчезали при закрытии. Технически — потеря данных.

За 37 промптов, 34 коммита и правки в 30 файлах Уиллисон и агент проработали все замечания. Пока Claude Fable по 10–15 минут обдумывал сложные задачи, автор успел сходить на парад 4 июля в Half Moon Bay и подсказывал следующий шаг с телефона.

Главное изменение — полностью переработанная модель транзакций. Теперь каждый метод записи (insert(), upsert(), delete(), transform(), create_index() и другие) сам открывает транзакцию и коммитит её до возврата управления. Данные сохраняются на диск сразу. Вызывать commit() или закрывать базу больше не нужно. Исключений два: либо ты сам группируешь операции в db.atomic(), либо сам управляешь транзакцией через db.begin(). Также библиотека теперь явно не поддерживает соединения, созданные с флагами autocommit=True или autocommit=False из Python 3.12 — это ломало почти все тесты.

Потом Уиллисон дал на проверку кода другой модели — GPT-5.5 от OpenAI. Идея «одна модель проверяет работу другой» казалась ему странной, но на практике сработала. GPT-5.5 нашёл два бага. Первый: db.query("update ...") сначала выполнял запрос на запись и коммитил его, и только потом проверял, возвращает ли SQL строки — и кидал ValueError, хотя данные уже были записаны. Второй: INSERT ... RETURNING через db.query() коммитился только после полного перебора генератора — а в документации обещалось, что команда срабатывает сразу.

Среди прочих правок: валидация теперь кидает ValueError вместо AssertionError (который молча пропускается при флаге -O), upsert() требует значения для первичного ключа, enable_wal() нельзя вызвать внутри открытой транзакции, а команды drop-table и drop-view перестали молча удалять объекты не того типа.

Читать оригинал →