
Safe / Not Safe בודק מיגרציות של Postgres לפני הפריסה
כלי קוד פתוח שפועל מקומית מנתח מיגרציה של Postgres בדפדפן באמצעות libpg_query ומחזיר פסק דין SAFE, NOT SAFE או NEEDS CONTEXT לפני שהשינוי מגיע לפרודקשן, בלי שרת ובלי רישום שאילתות.
פסק דין לפני הפריסה
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 מודרני, אבל default מסוג expression או volatile עדיין משכתב את כל הטבלה. 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 בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.