უკან დაბრუნება
ახალი ხელსაწყო Postgres-ის მიგრაციებს გაშვებამდე ამოწმებს
SiTech AI Team2 წთ. საკითხავი

ახალი ხელსაწყო Postgres-ის მიგრაციებს გაშვებამდე ამოწმებს

ღია კოდის ხელსაწყო Safe / Not Safe Postgres-ის მიგრაციას ბრაუზერშივე აანალიზებს და გაშვებამდე SAFE, NOT SAFE ან NEEDS CONTEXT შეფასებას გასცემს, ბექენდისა და SQL-ის ლოგების გარეშე.

შეფასება გაშვებამდე

ღია კოდის ხელსაწყო Safe / Not Safe (safenotsafe.dev) PostgreSQL-ის მიგრაციებს ამოწმებს და მთლიანად ბრაუზერში მუშაობს. დეველოპერი მიგრაციის SQL-ს რედაქტორში ჩასვამს, ტექსტს Web Worker-ში, WebAssembly-ად აწყობილი libpg_query-ის პარსერი ამუშავებს და ხელსაწყო სამი შეფასებიდან ერთს გასცემს: SAFE, NOT SAFE ან NEEDS CONTEXT. პროექტის README-ის მიხედვით, მიზანი შეგნებულად ვიწროა: სქემის ცვლილების ხაფანგები მანამ უნდა დაიჭიროს, სანამ ისინი სამუშაო ბაზას მიაღწევს.

შეფასებამდე აპლიკაცია ორ დეტალს იკითხავს: რამდენი მწკრივია სამიზნე ცხრილში (50 ათასზე ნაკლები, 50 ათასიდან 5 მილიონამდე, 5 მილიონზე მეტი) და ახვევს თუ არა გაშვების ხელსაწყო DDL-ს ტრანზაქციაში. სწორედ ამიტომ არსებობს მესამე შეფასება: ზოგი ბრძანება მხოლოდ გარკვეული ზომის ცხრილზე ან ტრანზაქციის შიგნითაა საშიში.

რას ამოწმებს წესების კატალოგი

წესები TypeScript-ზეა დაწერილი და რეპოზიტორია 12 შემოწმებას ჩამოთვლის: ჩვეულებრივი CREATE INDEX CREATE INDEX CONCURRENTLY-ის წინააღმდეგ, CONCURRENTLY ტრანზაქციის ჩარჩოში, default-იანი ახალი სვეტები, ALTER COLUMN TYPE-ის გამო ცხრილის სრული გადაწერა, NOT VALID-ის გარეშე დამატებული foreign key, 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-ის გარეშე დამატებული foreign key ყველა არსებულ მწკრივს მაშინვე ამოწმებს; თუ ჯერ NOT VALID-ით დაამატებ და VALIDATE CONSTRAINT-ს მოგვიანებით გაუშვებ, სამუშაო ორ ეტაპად გადანაწილდება. სახელის შეცვლა და DROP COLUMN სხვანაირად საშიშია: ეტაპობრივი გაშვების დროს ჯერ კიდევ მომუშავე ძველი აპლიკაციები ძველ სახელს ეძებენ.

ლოკალური მუშაობა და CLI

მთელი ანალიზი ბრაუზერის ტაბში მიმდინარეობს. ბუფერები დისკზე არ ინახება, არაფერი იტვირთება სერვერზე და პროექტის კონფიდენციალურობის განყოფილების მიხედვით, არ არსებობს API მარშრუტი, რომელიც ჩასმულ SQL-ს მიიღებს, არ არის მონაცემთა ბაზის მიბმები და ტელემეტრია. იგივე ძრავა CLI-ის სახითაც არის შეფუთული: npx safe-not-safe check migration.sql ბრძანება პარსინგის შედეგს ტერმინალში ბეჭდავს.

სტეკი Vite-ით აწყობილი React-ის აპლიკაციაა; პარსერი წინასწარ გაშვებულ Web Worker-ში მუშაობს, რომ WASM-ის კომპილაციის დროს ინტერფეისი არ გაიჭედოს. გამოქვეყნების სამიზნე Cloudflare Workers-ია, რომლის კონფიგურაციაში განზრახ არ არის D1, R2 ან KV მიბმები. კოდი GitHub-ზე, viggy28/safe-not-safe რეპოზიტორიაშია.

SSiTech

SiTech — AI-გაძლიერებული ვებ დეველოპმენტი

ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.