bitlvl
SR

SQL formater

Nalepite upit, migraciju ili ceo dump naredbi. Ključnim rečima se menja veličina slova, klauzule idu u svoje redove, podupiti, CTE, CASE izrazi i JOIN uslovi se uvlače, a stringovi, identifikatori i komentari ostaju tačno kakvi su bili. Radi sa sintaksom PostgreSQL-a, MySQL-a/MariaDB, SQLite-a i SQL Servera.

Rezultati i poruke ovog alata prikazuju se na engleskom.

Šta formater radi

  • Klauzule (SELECT, FROM, WHERE, GROUP BY, ORDER BY, SET, VALUES, RETURNING…) svaka počinje red; njihov sadržaj je uvučen ispod, po jedna stavka u redu za liste.
  • Join-ovi počinju red na nivou klauzule; ON uslov ostaje uz join, a dalji AND/OR članovi se uvlače ispod njega.
  • Podupiti i CTE otvaraju blok u zagradama čiji je sadržaj uvučen jedan nivo; kratke liste u zagradama (IN ('a', 'b'), argumenti funkcija, torke) ostaju u jednom redu.
  • CASE izrazi stavljaju svaki WHEN i ELSE u svoj red i poravnavaju END sa CASE.
  • Window funkcije drže OVER (PARTITION BY … ORDER BY …) u jednom redu kada staje.
  • CREATE TABLE ispisuje jednu definiciju kolone po redu; INSERT … VALUES ispisuje jednu torku po redu.
  • Naredbe su razdvojene praznim redom posle svake tačke i zareza.

Šta nikada ne dira

String literali ('it''s', E'\n', $$ … $$), identifikatori pod navodnicima ("Ime", `ime`, [ime]), komentari (--, #, /* */) i parametri (?, $1, :ime, @var) kopiraju se bajt po bajt. Menjaju se samo beline i veličina slova ključnih reči, pa je formatirani upit isti upit. Promena veličine slova važi za SQL ključne reči i standardne funkcije (COUNT, COALESCE, NOW…), a ne za vaše identifikatore: my_table ostaje my_table čak i u režimu velikih slova.

Završni ili vodeći zarezi

Završni zarezi (a, na kraju reda) su ono što proizvodi većina stilskih vodiča i ORM-ova. Vodeći zarezi (, b na početku) omogućavaju da zakomentarišete bilo koji red select liste osim prvog bez kvarenja upita, zbog čega su popularni u analitičkom SQL-u. Izaberite ono što vaš tim brže čita; formater konvertuje između ta dva stila.

Minifikacija

Minifikacija sažima sve u jedan red sa jednostrukim razmacima, pretvarajući linijske komentare u blok komentare da bi preživeli. Koristite je za log linije, URL parametre ili lepljenje upita u chat bez gubljenja prelaza u novi red.

Dijalekti

Tokenizator razume PostgreSQL (:: kastovanje, $1 parametre, dollar quoting, ->> JSON operatore, FILTER, RETURNING, ON CONFLICT), MySQL/MariaDB (identifikatore u backtick-ovima, # komentare, STRAIGHT_JOIN, ON DUPLICATE KEY UPDATE, LIMIT x OFFSET y), SQLite i SQL Server ([uglaste] identifikatore, @promenljive, TOP, CROSS APPLY). Ne validira SQL; upit sa sintaksnom greškom se formatira koliko je moguće da biste ipak mogli da ga pročitate.

Formatiranje SQL-a drugde

# PostgreSQL: pg_format (pgFormatter, Perl)
pg_format -s 2 -u 1 query.sql

# bilo koji dijalekt: sqlfluff (Python), radi i lint
sqlfluff fix --dialect postgres query.sql

# JavaScript: sql-formatter
npx sql-formatter -l postgresql query.sql

Pitanja

Da li menja ono što upit radi?

Ne. Menjaju se samo beline i veličina slova ključnih reči; literali, identifikatori, komentari i parametri se kopiraju nepromenjeni. Promena veličine slova važi za ključne reči i nazive standardnih funkcija, koji su neosetljivi na veličinu slova u svakom SQL dijalektu.

Zašto je podupit u više redova iako je kratak?

Svaka grupa u zagradama koja sadrži ključnu reč klauzule (SELECT, FROM, WHERE…) ispisuje se kao blok, jer to čini ugnežđene upite čitljivim. Argumenti funkcija, IN liste i VALUES torke ostaju u jednom redu kada su kratki.

Može li da formatira PL/pgSQL funkcije ili uskladištene procedure?

Telo funkcije u $$ … $$ je za formater string literal i ostavlja se kakvo jeste. Naredba CREATE FUNCTION oko njega se formatira. Potpuno formatiranje proceduralnog jezika je van opsega.

Da li se moj SQL šalje na server?

Ne. Stranica radi u potpunosti u vašem pregledaču, što je i poenta za upite koji sadrže produkcione nazive tabela ili literale.

Šta je sa izlazom EXPLAIN-a?

To je drugi alat: nalepite plan u EXPLAIN vizuelizator, koji crta stablo i označava pogrešne procene.