§

Μορφοποίηση SQL ερωτημάτων

Διάλεκτος
Εσοχή
Πεζογραφία λέξεων-κλειδιών
Αλλαγή γραμμής πριν από ρήτρα
§

Επικολλήστε SQL

§

Μορφοποιημένη SQL

Οι ομάδες μηχανικής δεδομένων των ΗΠΑ αντιμετωπίζουν τη μορφοποίηση SQL ως πύλη ελέγχου PR. Οι διαφορές PR στο GitHub έναντι μιας αποθήκης Snowflake γίνονται μη αναγνώσιμες όταν ένας μηχανικός μορφοποιεί με το χέρι ένα CTE 200 γραμμών και ένας άλλος το επικολλά πίσω ως μονή γραμμή· η διαφορά εκρήγνυται σε θόρυβο που κρύβει την πραγματική αλλαγή λογικής. Η dbt Labs αποστέλλει έναν οδηγό στυλ SQL που οι περισσότερες νεοφυείς επιχειρήσεις ανάλυσης των ΗΠΑ υιοθετούν αυτολεξεί και το Snowflake Snowsight αναμορφώνει τα ερωτήματα κατά την αποθήκευση με συμβάσεις που ταιριάζουν με τις προεπιλογές του sql-formatter που χρησιμοποιεί αυτό το εργαλείο. Η εκτέλεση ερωτημάτων μέσω συνεπούς μορφοποιητή πριν από τη δέσμευση μειώνει τους κύκλους αναθεώρησης και κάνει τη διαφορά σειράς στηλών που πρέπει πραγματικά να διαβάσει ο κριτής να κάθεται στη δική της γραμμή.

Πώς λειτουργεί η μορφοποίηση SQL

Η μορφοποίηση SQL είναι μια επανεγγραφή με γνώμονα τον λεξιλογικό αναλυτή που περνά από κάθε διακριτικό στο ερώτημα και επανεκπέμπει λευκό διάστημα γύρω του βάσει των κανόνων για την επιλεγμένη διάλεκτο. Η σημασιολογία του ερωτήματος δεν αλλάζει ποτέ, μόνο η διάταξη.

  1. Επιλέξτε μια διάλεκτο. Τα backticks MySQL, οι μετατροπές PostgreSQL ::, οι διαδρομές πίνακα με τελείες BigQuery και τα αναγνωριστικά με αγκύλες T-SQL χρειάζονται έναν tokenizer που τα γνωρίζει. Ο επιλογέας διαλέκτου επιλέγει ποια γραμματική θα εφαρμοστεί.
  2. Tokenize την είσοδο. Ο μορφοποιητής χωρίζει το ερώτημα σε μια ροή διακριτικών: λέξεις-κλειδιά (SELECT, JOIN), αναγνωριστικά, κυριολεκτικά, τελεστές, παρενθέσεις και σχόλια. Τα κυριολεκτικά συμβολοσειρών και τα αναγνωριστικά με εισαγωγικά περνούν άθικτα, ώστε η σύνταξη ειδική για τη διάλεκτο να συνεχίζει να λειτουργεί.
  3. Εφαρμογή κανόνων διάταξης. Οι ρήτρες ανώτατου επιπέδου (SELECT, FROM, WHERE, GROUP BY, ORDER BY) ξεκινούν στη δική τους γραμμή. Οι εκφράσεις διαχωρισμένες με κόμμα στη λίστα επιλογής και τις λίστες στηλών παίρνουν η καθεμία μια γραμμή, με εσοχή από την επιλεγμένη μονάδα εσοχής.
  4. Εφαρμογή πεζογραφίας λέξεων-κλειδιών. Η εναλλαγή πεζογραφίας λέξεων-κλειδιών ξαναγράφει τις αναγνωρισμένες λέξεις-κλειδιά SQL σε κεφαλαία, πεζά ή διατηρεί την πεζογραφία της εισόδου αυτολεξεί. Τα αναγνωριστικά δεν αγγίζονται ποτέ — τα ονόματα στηλών και πινάκων περνούν πάντα όπως γράφτηκαν.
  5. Εκπομπή της μορφοποιημένης συμβολοσειράς. Η ροή διακριτικών επανενώνεται σε μία συμβολοσειρά με τον χαρακτήρα εσοχής (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 κάνει την επανεγγραφή.