
Safe / Not Safe перевіряє міграції Postgres до запуску
Інструмент з відкритим кодом працює локально: він розбирає міграцію Postgres у браузері через libpg_query і видає вердикт SAFE, NOT SAFE або NEEDS CONTEXT ще до деплою, без бекенду та логування SQL.
Вердикт до деплою
Safe / Not Safe (safenotsafe.dev) — це перевірка міграцій PostgreSQL, яка повністю працює в браузері. Розробник вставляє міграцію в редактор, SQL розбирається у Web Worker парсером libpg_query, скомпільованим у WebAssembly, і інструмент повертає один із трьох вердиктів: SAFE, NOT SAFE або NEEDS CONTEXT. Мета, за README проєкту, вузька навмисно: виловити знайомі пастки змін схеми до того, як вони потраплять у продакшн.
Перед оцінкою застосунок ставить два уточнення: скільки рядків у цільовій таблиці (менше 50 тис., від 50 тис. до 5 млн, понад 5 млн) і чи обгортає інструмент деплою DDL у транзакцію. Через це й існує третій вердикт: деякі команди небезпечні лише за певного розміру таблиці або всередині транзакції.
Що шукає каталог правил
Правила написані на TypeScript, і репозиторій перелічує дванадцять перевірок: звичайний CREATE INDEX проти CREATE INDEX CONCURRENTLY, CONCURRENTLY у транзакційній обгортці, додані колонки з default, перезапис таблиці через ALTER COLUMN TYPE, зовнішні ключі без NOT VALID, VALIDATE CONSTRAINT, SET NOT NULL, DROP COLUMN, перейменування, пряме створення unique constraint, TRUNCATE та команди перезапису, як-от VACUUM FULL і CLUSTER.
Кожна з них має реальну ціну. Звичайний CREATE INDEX блокує запис на весь час побудови; CREATE INDEX CONCURRENTLY цього не робить, але не може виконуватися всередині транзакції. Колонка зі сталим default на сучасному PostgreSQL дешева, проте expression або volatile default усе одно перезаписують усю таблицю. ALTER COLUMN TYPE зазвичай перезаписує таблицю і тримає сильне блокування. Зовнішній ключ, доданий без NOT VALID, одразу перевіряє всі наявні рядки; якщо додати його як NOT VALID, а VALIDATE CONSTRAINT виконати пізніше, робота розподіляється на два кроки. Перейменування та DROP COLUMN небезпечні інакше: під час поетапного деплою ще живі старі версії застосунку звертаються до старої назви.
Локальна робота та CLI
Увесь аналіз відбувається у вкладці браузера. Буфери не зберігаються на диск, нічого не надсилається на сервер, і, за словами проєкту, немає ні API-маршруту, який отримує вставлений SQL, ні прив'язок до бази даних, ні телеметрії. Той самий рушій доступний і як CLI: npx safe-not-safe check migration.sql друкує результат розбору в терміналі.
Стек — оболонка застосунку на React зі збіркою на Vite; парсер працює в заздалегідь ініціалізованому Web Worker, щоб інтерфейс не зависав під час компіляції WASM. Цільовий майданчик — Cloudflare Workers, у конфігурації якого навмисно немає прив'язок D1, R2 чи KV. Код відкритий на GitHub у репозиторії viggy28/safe-not-safe.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.