Πώς λειτουργεί η μορφοποίηση SQL
Η μορφοποίηση SQL είναι μια επανεγγραφή με γνώμονα τον λεξιλογικό αναλυτή που περνά από κάθε διακριτικό στο ερώτημα και επανεκπέμπει λευκό διάστημα γύρω του βάσει των κανόνων για την επιλεγμένη διάλεκτο. Η σημασιολογία του ερωτήματος δεν αλλάζει ποτέ, μόνο η διάταξη.
- Επιλέξτε μια διάλεκτο. Τα backticks MySQL, οι μετατροπές PostgreSQL
::, οι διαδρομές πίνακα με τελείες BigQuery και τα αναγνωριστικά με αγκύλες T-SQL χρειάζονται έναν tokenizer που τα γνωρίζει. Ο επιλογέας διαλέκτου επιλέγει ποια γραμματική θα εφαρμοστεί. - Tokenize την είσοδο. Ο μορφοποιητής χωρίζει το ερώτημα σε μια ροή διακριτικών: λέξεις-κλειδιά (
SELECT,JOIN), αναγνωριστικά, κυριολεκτικά, τελεστές, παρενθέσεις και σχόλια. Τα κυριολεκτικά συμβολοσειρών και τα αναγνωριστικά με εισαγωγικά περνούν άθικτα, ώστε η σύνταξη ειδική για τη διάλεκτο να συνεχίζει να λειτουργεί. - Εφαρμογή κανόνων διάταξης. Οι ρήτρες ανώτατου επιπέδου (
SELECT,FROM,WHERE,GROUP BY,ORDER BY) ξεκινούν στη δική τους γραμμή. Οι εκφράσεις διαχωρισμένες με κόμμα στη λίστα επιλογής και τις λίστες στηλών παίρνουν η καθεμία μια γραμμή, με εσοχή από την επιλεγμένη μονάδα εσοχής. - Εφαρμογή πεζογραφίας λέξεων-κλειδιών. Η εναλλαγή πεζογραφίας λέξεων-κλειδιών ξαναγράφει τις αναγνωρισμένες λέξεις-κλειδιά SQL σε κεφαλαία, πεζά ή διατηρεί την πεζογραφία της εισόδου αυτολεξεί. Τα αναγνωριστικά δεν αγγίζονται ποτέ — τα ονόματα στηλών και πινάκων περνούν πάντα όπως γράφτηκαν.
- Εκπομπή της μορφοποιημένης συμβολοσειράς. Η ροή διακριτικών επανενώνεται σε μία συμβολοσειρά με τον χαρακτήρα εσοχής (2 κενά, 4 κενά ή tab) και τον κανόνα αλλαγής γραμμής που έχει ρυθμιστεί. Η ζωντανή λειτουργία εκτελεί ξανά ολόκληρο τον αγωγό με αποκλιμάκωση 200 ms καθώς πληκτρολογείτε.
Γιατί να μορφοποιήσετε SQL
- Αναγνωσιμότητα διαφορών PR. Μια CTE 200 γραμμών ξαναγραμμένη ως μία γραμμή μετατρέπει μια αναθεώρηση κώδικα σε παιχνίδι μαντεψιάς. Η συνεπής μορφοποίηση διατηρεί τη διαφορά περιορισμένη στην αλλαγή που κάνατε πραγματικά — μια νέα στήλη, ένα επιπλέον
JOIN, μια διαφορετική συνθήκηWHERE— ώστε ο κριτής να τη δει χωρίς να ξεμπερδέψει λευκό διάστημα. - Ευκολότερος εντοπισμός σφαλμάτων. Όταν ένα ερώτημα επιστρέφει λάθος αριθμό γραμμών, το πρώτο πράγμα που κάνετε είναι να το διαβάσετε γραμμή προς γραμμή. Η μορφοποιημένη SQL βάζει κάθε
JOINστη δική του γραμμή και ευθυγραμμίζει τις συνθήκεςWHEREώστε έναANDπου λείπει ή έναORπου περισσεύει να φαίνεται με μια ματιά. - Συνεπές στυλ ομάδας. Οι περισσότερες ομάδες υιοθετούν έναν οδηγό στυλ SQL (dbt Labs, GitLab, Mode Analytics δημοσιεύουν τους δικούς τους) και θέλουν κάθε δεσμευμένο ερώτημα να τον ακολουθεί. Ένας μορφοποιητής που τρέχει πριν από τη δέσμευση αφαιρεί το επιχείρημα στυλ από την αναθεώρηση και αφήνει μόνο τη λογική για συζήτηση.
- Κοινή χρήση SQL σε έγγραφα. Τα runbooks, τα incident retros και τα έγγραφα Notion ωφελούνται όλα από SQL που διαβάζεται από πάνω προς τα κάτω. Η μορφοποιημένη SQL επικολλάται καθαρά σε ένα μπλοκ κώδικα με περίφραξη και εκτυπώνεται προβλέψιμα σε εξαγωγές PDF, χωρίς άβολες αναδιπλώσεις γραμμών στη μέση μιας λέξης-κλειδιού.
Συνήθεις εφαρμογές
Η μορφοποίηση SQL εμφανίζεται στη μηχανική ανάλυσης, την ανάπτυξη backend και τις λειτουργίες όποτε ένα ερώτημα πρέπει να διαβαστεί από κάποιον που δεν το έγραψε.
- Μηχανική ανάλυσης: pre-commit hook σε ένα έργο dbt που αναμορφώνει κάθε αρχείο μοντέλου ώστε οι διαφορές PR να παραμένουν περιορισμένες σε αλλαγές λογικής, όχι σε ανακατατάξεις λευκού διαστήματος.
- Διαχείριση βάσεων δεδομένων: επικολλήστε μια μονόγραμμη καταχώρηση αργού ερωτήματος, μορφοποιήστε την και εξετάστε τη σειρά JOIN γράφοντας το incident retro.
- Τεκμηρίωση: πάρτε ένα ερώτημα από ένα Looker explore ή Tableau workbook, μορφοποιήστε το για ένα runbook και ενσωματώστε το ως παράδειγμα αντιγραφής-επικόλλησης για την εφημερία.
Ένα παράδειγμα
Επικολλήστε 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; στο πλαίσιο εισόδου με διάλεκτο PostgreSQL, εσοχή 2 κενά και πεζογραφία λέξεων-κλειδιών UPPER. Η έξοδος τοποθετεί SELECT, FROM, LEFT JOIN, WHERE, GROUP BY και ORDER BY στις δικές τους γραμμές· κάθε στήλη στη λίστα επιλογής και τη λίστα group-by παίρνει τη δική της γραμμή με εσοχή· και η συνθήκη ON κάθεται μία εσοχή βαθύτερα από τη λέξη-κλειδί JOIN στην οποία ανήκει. Το ίδιο ερώτημα μέσω της διαλέκτου BigQuery παράγει πανομοιότυπη έξοδο γι' αυτή την περίπτωση, αλλά θα διατηρούσε τα αναγνωριστικά με backtick αν υπήρχαν.
FAQ
Ποιες διαλέκτους SQL υποστηρίζονται;
Το αναπτυσσόμενο μενού διαλέκτων καλύπτει Standard SQL, MySQL, PostgreSQL, SQLite, MariaDB, Transact-SQL (SQL Server / Azure SQL), BigQuery, Snowflake και Redshift. Η υποκείμενη βιβλιοθήκη sql-formatter αναγνωρίζει επίσης DuckDB, Spark SQL, Hive, Trino, Db2, N1QL, PL/SQL, ClickHouse, TiDB και SingleStoreDB — η επιλογή της πλησιέστερης διαλέκτου παράγει λογική έξοδο ακόμα κι όταν ο ακριβής στόχος δεν είναι στη λίστα. Τα αναγνωριστικά, τα κυριολεκτικά συμβολοσειρών και οι τελεστές ειδικοί για τη διάλεκτο (PostgreSQL @>, προθέματα BigQuery SAFE.) διατηρούνται αυτολεξεί.
Επικυρώνει αυτό το SQL μου;
Όχι. Ο μορφοποιητής είναι ένας λεξιλογικός επαναγραφέας, όχι ένας αναλυτής. Tokenize την είσοδο, εφαρμόζει κανόνες διάταξης και εκπέμπει το αποτέλεσμα· δεν ελέγχει αν το ερώτημα είναι σημασιολογικά έγκυρο, αν υπάρχουν οι αναφερόμενοι πίνακες ή αν η σύνταξη είναι νόμιμη στην επιλεγμένη διάλεκτο. Εκτελέστε τη μορφοποιημένη έξοδο μέσω της πραγματικής βάσης δεδομένων (ή ενός linter SQL όπως το SQLFluff) για έναν πραγματικό έλεγχο ορθότητας.
Γιατί οι λέξεις-κλειδιά μου γίνονται κεφαλαίες;
Το αναπτυσσόμενο μενού Πεζογραφίας λέξεων-κλειδιών προεπιλέγει ΚΕΦΑΛΑΙΑ, τη σύμβαση στους περισσότερους δημοσιευμένους οδηγούς στυλ SQL (dbt Labs, Mode, GitLab). Αλλάξτε σε πεζά αν η ομάδα σας γράφει select / from με πεζά ή Διατήρηση αν θέλετε η έξοδος να διατηρήσει ό,τι πεζογραφία πληκτρολογήσατε. Τα αναγνωριστικά δεν επηρεάζονται ποτέ — μόνο το αναγνωρισμένο σύνολο λέξεων-κλειδιών ξαναγράφεται.
Μεταφορτώνεται το ερώτημά μου κάπου;
Όχι. Η βιβλιοθήκη sql-formatter που συνοδεύεται με τη σελίδα τρέχει στο πρόγραμμα περιήγησής σας, η μορφοποίηση γίνεται τοπικά στο μηχάνημά σας και το κείμενο του ερωτήματος δεν περνά ποτέ από το δίκτυο. Τα μόνα εξερχόμενα αιτήματα που κάνει αυτή η σελίδα είναι τα ίδια κοινά αιτήματα αναλυτικών και διαφημίσεων που κάνει κάθε σελίδα στο tools.ultim8soft.com· το ίδιο το κείμενο SQL δεν αποτελεί μέρος κανενός.
Η μορφοποιημένη SQL σταματά να είναι επιχείρημα στυλ όταν ένας μορφοποιητής την αναλαμβάνει. Το εργαλείο τρέχει εξ ολοκλήρου στο πρόγραμμα περιήγησής σας, το ερώτημα δεν φεύγει ποτέ από τη σελίδα και ο ίδιος tokenizer με επίγνωση διαλέκτου που τροφοδοτεί το πακέτο npm sql-formatter κάνει την επανεγγραφή.