Jak działa formatowanie SQL
Formatowanie SQL to przepisywanie sterowane lekserem, które przechodzi przez każdy token w zapytaniu i ponownie emituje białe znaki wokół niego na podstawie reguł wybranego dialektu. Semantyka zapytania nigdy się nie zmienia — tylko układ.
- Wybierz dialekt. Backticki MySQL, rzutowania
::PostgreSQL, ścieżki tabel z kropkami BigQuery i identyfikatory w nawiasach kwadratowych T-SQL — każdy z nich wymaga tokenizera, który je zna. Selektor dialektu wybiera gramatykę do zastosowania. - Tokenizuj wejście. Formater dzieli zapytanie na strumień tokenów: słowa kluczowe (
SELECT,JOIN), identyfikatory, literały, operatory, nawiasy i komentarze. Literały łańcuchowe i cytowane identyfikatory są przepuszczane bez zmian, dzięki czemu składnia specyficzna dla dialektu nadal działa. - Zastosuj reguły układu. Klauzule najwyższego poziomu (
SELECT,FROM,WHERE,GROUP BY,ORDER BY) zaczynają się we własnej linii. Każde wyrażenie oddzielone przecinkiem na liście select i listach kolumn otrzymuje osobną linię z wcięciem zgodnym z wybraną jednostką wcięcia. - Zastosuj wielkość liter słów kluczowych. Przełącznik wielkości liter słów kluczowych przepisuje rozpoznane słowa kluczowe SQL na wielkie, małe litery lub zachowuje oryginalne formatowanie wejścia. Identyfikatory nigdy nie są dotykane — nazwy kolumn i tabel zawsze pojawiają się tak, jak zostały zapisane.
- Emituj sformatowany ciąg. Strumień tokenów jest z powrotem łączony w jeden ciąg ze znakiem wcięcia (2 spacje, 4 spacje lub tabulator) i skonfigurowaną regułą nowej linii. Tryb live uruchamia cały potok ponownie z debouncingiem 200 ms podczas pisania.
Dlaczego czytelnie drukować SQL
- Czytelność różnic pull-requestów. Przepisanie 200-liniowego CTE jako jednej linii zamienia code review w grę w zgadywanie. Spójne formatowanie sprawia, że diff jest ograniczony do faktycznie dokonanej zmiany — nowej kolumny, dodatkowego
JOIN, innego predykatuWHERE— więc recenzent może go zobaczyć bez rozplątywania białych znaków. - Łatwiejsze debugowanie. Gdy zapytanie zwraca błędną liczbę wierszy, pierwszą czynnością jest przeczytanie go linijka po linijce. Sformatowany SQL umieszcza każdy
JOINwe własnej linii i wyrównuje predykatyWHERE, więc brakującyANDlub przypadkowyORwidać na pierwszy rzut oka. - Spójny styl zespołu. Większość zespołów przyjmuje przewodnik po stylu SQL (dbt Labs, GitLab, Mode Analytics publikują swoje) i chce, aby każde zatwierdzone zapytanie go przestrzegało. Formater uruchamiany przed commitem usuwa argument o stylu z przeglądu i pozostawia tylko logikę do omówienia.
- Udostępnianie SQL w dokumentacji. Runbooki, retrospektywy incydentów i dokumenty Notion korzystają na SQL, który czyta się od góry do dołu. Sformatowany SQL wkleja się czysto do bloku kodu i wydrukuje przewidywalnie w eksportach PDF, bez niezręcznych zawinięć linii w środku słowa kluczowego.
Typowe zastosowania
Formatowanie SQL pojawia się w inżynierii analitycznej, programowaniu backendowym i operacjach zawsze, gdy zapytanie musi być przeczytane przez kogoś, kto go nie pisał.
- Inżynieria analityczna: hook pre-commit w projekcie dbt, który ponownie formatuje każdy plik modelu, aby różnice PR były ograniczone do zmian logiki, a nie zamieszania ze spacjami.
- Administracja bazą danych: wklej jednoliniowy wpis z dziennika powolnych zapytań, sformatuj go i prześledź kolejność złączeń podczas pisania retrospektywy incydentu.
- Dokumentacja: weź zapytanie z Looker explore lub Tableau workbook, sformatuj je do runbooka i osadź jako gotowy do skopiowania przykład dla dyżurujących.
Przykład krok po kroku
Wklej SELECT u.id,u.email,COUNT(o.id) FROM users u LEFT JOIN orders o ON o.user_id=u.id WHERE u.created_at > '2024-01-01' GROUP BY u.id,u.email ORDER BY u.id; do panelu wejściowego z dialektem ustawionym na PostgreSQL, wcięciem 2 spacje i wielkością liter słów kluczowych WIELKIE. Wynik umieszcza SELECT, FROM, LEFT JOIN, WHERE, GROUP BY i ORDER BY we własnych liniach; każda kolumna na liście select i liście group-by otrzymuje własną wciętą linię; a predykat ON jest o jedno wcięcie głębiej niż słowo kluczowe JOIN, do którego należy.
FAQ
Które dialekty SQL są obsługiwane?
Lista rozwijana dialektów obejmuje: Standard SQL, MySQL, PostgreSQL, SQLite, MariaDB, Transact-SQL (SQL Server / Azure SQL), BigQuery, Snowflake i Redshift. Podstawowa biblioteka sql-formatter rozpoznaje również DuckDB, Spark SQL, Hive, Trino, Db2, N1QL, PL/SQL, ClickHouse, TiDB i SingleStoreDB — wybranie najbliższego dialektu daje sensowny wynik nawet gdy dokładny cel nie jest na liście. Identyfikatory, literały łańcuchowe i operatory specyficzne dla dialektu (PostgreSQL @>, prefiksy BigQuery SAFE.) są zachowywane dosłownie.
Czy to narzędzie waliduje mój SQL?
Nie. Formater to leksykalny przepisywacz, nie parser. Tokenizuje wejście, stosuje reguły układu i emituje wynik; nie sprawdza, czy zapytanie jest semantycznie poprawne, czy tabele, do których się odwołuje, istnieją, czy składnia jest prawidłowa w wybranym dialekcie. Uruchom sformatowany wynik przez rzeczywistą bazę danych (lub linter SQL, taki jak SQLFluff), aby uzyskać prawdziwą kontrolę poprawności.
Dlaczego moje słowa kluczowe są pisane wielkimi literami?
Lista rozwijana wielkości liter słów kluczowych domyślnie ustawia WIELKIE — to konwencja w większości opublikowanych przewodników po stylu SQL (dbt Labs, Mode, GitLab). Przełącz na małe, jeśli Twój zespół pisze select / from małymi literami, lub Zachowaj, jeśli chcesz, aby wynik zachował użyte formatowanie. Identyfikatory nigdy nie są zmieniane — tylko rozpoznany zestaw słów kluczowych jest przepisywany.
Czy moje zapytanie jest gdzieś przesyłane?
Nie. Dołączona biblioteka sql-formatter działa w Twojej przeglądarce, formatowanie odbywa się lokalnie na Twoim komputerze, a tekst zapytania nigdy nie przekracza sieci. Jedyne wychodzące żądania wykonywane przez tę stronę to te same wspólne żądania analityczne i reklamowe, które wykonuje każda strona na tools.ultim8soft.com; tekst SQL nie jest częścią żadnego z nich.
Czytelne drukowanie SQL przestaje być kwestią stylu, gdy formater się tym zajmuje. Narzędzie działa całkowicie w Twojej przeglądarce, zapytanie nigdy nie opuszcza strony, a ten sam tokenizer świadomy dialektu, który zasila pakiet sql-formatter npm, wykonuje przepisywanie.