Cách định dạng SQL hoạt động
Định dạng SQL là quá trình viết lại do lexer điều khiển, duyệt qua từng token trong truy vấn và phát lại khoảng trắng xung quanh nó dựa trên các quy tắc cho phương ngữ đã chọn. Ngữ nghĩa truy vấn không bao giờ thay đổi, chỉ có bố cục.
- Chọn phương ngữ. Backtick MySQL, cast
::PostgreSQL, đường dẫn bảng có dấu chấm BigQuery và định danh dấu ngoặc vuông T-SQL mỗi loại cần một tokenizer biết về chúng. Bộ chọn phương ngữ xác định ngữ pháp nào được áp dụng. - Tokenize đầu vào. Trình định dạng tách truy vấn thành luồng token: từ khóa (
SELECT,JOIN), định danh, giá trị nghĩa đen, toán tử, dấu ngoặc đơn và chú thích. Chuỗi nghĩa đen và định danh có dấu nháy được truyền qua nguyên vẹn để cú pháp đặc thù của phương ngữ tiếp tục hoạt động. - Áp dụng quy tắc bố cục. Các mệnh đề cấp cao (
SELECT,FROM,WHERE,GROUP BY,ORDER BY) bắt đầu trên dòng riêng của chúng. Các biểu thức phân cách bằng dấu phẩy trong danh sách chọn và danh sách cột mỗi cái có một dòng, thụt lề theo đơn vị thụt lề đã chọn. - Áp dụng kiểu chữ từ khóa. Nút kiểu chữ từ khóa viết lại các từ khóa SQL đã nhận dạng thành chữ hoa, chữ thường hoặc giữ nguyên kiểu chữ đầu vào. Định danh không bao giờ bị chạm vào — tên cột và bảng luôn đến như đã viết.
- Phát ra chuỗi đã định dạng. Luồng token được nối lại thành một chuỗi duy nhất với ký tự thụt lề (2 dấu cách, 4 dấu cách hoặc tab) và quy tắc ngắt dòng đã cấu hình. Chế độ trực tiếp chạy lại toàn bộ pipeline với debounce 200 ms khi bạn gõ.
Tại sao in đẹp SQL
- Khả năng đọc diff pull-request. Một CTE 200 dòng được viết lại thành một dòng biến code review thành trò chơi đoán. Định dạng nhất quán giữ cho diff trong phạm vi thay đổi bạn thực sự thực hiện — một cột mới, thêm
JOIN, mộtWHEREpredicate khác — để reviewer có thể thấy mà không cần gỡ rối khoảng trắng. - Gỡ lỗi dễ dàng hơn. Khi truy vấn trả về số hàng sai, điều đầu tiên bạn làm là đọc từng dòng. SQL được định dạng đặt mỗi
JOINtrên dòng riêng và căn thẳng cácWHEREpredicate đểANDbị thiếu hoặcORlạc lõng hiện ra ngay lập tức. - Phong cách nhóm nhất quán. Hầu hết các nhóm áp dụng hướng dẫn phong cách SQL (dbt Labs, GitLab, Mode Analytics đều xuất bản của họ) và muốn mọi truy vấn được commit đều theo nó. Chạy formatter trước commit loại bỏ tranh luận về phong cách khỏi review và chỉ để lại logic để thảo luận.
- Chia sẻ SQL trong tài liệu. Runbook, retro sự cố và tài liệu Notion đều được hưởng lợi từ SQL đọc từ trên xuống. SQL được định dạng dán sạch vào khối code có rào cản và in dự đoán được trong xuất PDF, không có ngắt dòng lúng túng giữa từ khóa.
Ứng dụng phổ biến
Định dạng SQL xuất hiện trong kỹ thuật phân tích, phát triển backend và công việc vận hành bất cứ khi nào truy vấn phải được đọc bởi người không viết nó.
- Kỹ thuật phân tích: hook pre-commit trong dự án dbt định dạng lại mọi file model để diff PR giữ trong phạm vi thay đổi logic, không phải lộn xộn khoảng trắng.
- Quản trị cơ sở dữ liệu: dán mục log truy vấn chậm một dòng, định dạng nó và đi qua thứ tự join trong khi viết retro sự cố.
- Tài liệu: lấy truy vấn từ Looker explore hoặc workbook Tableau, định dạng cho runbook và nhúng làm ví dụ có thể sao chép cho rotation on-call.
Ví dụ đã thực hiện
Dán 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; vào bảng đầu vào với phương ngữ PostgreSQL, thụt lề 2 dấu cách và kiểu chữ từ khóa CHỮ HOA. Đầu ra đặt SELECT, FROM, LEFT JOIN, WHERE, GROUP BY và ORDER BY trên các dòng riêng của chúng; mỗi cột trong danh sách chọn và danh sách group-by có dòng thụt lề riêng; và predicate ON nằm sâu hơn một mức thụt lề so với từ khóa JOIN mà nó thuộc về.
FAQ
Những phương ngữ SQL nào được hỗ trợ?
Dropdown phương ngữ bao gồm SQL chuẩn, MySQL, PostgreSQL, SQLite, MariaDB, Transact-SQL (SQL Server / Azure SQL), BigQuery, Snowflake và Redshift. Thư viện sql-formatter cơ bản cũng nhận dạng DuckDB, Spark SQL, Hive, Trino, Db2, N1QL, PL/SQL, ClickHouse, TiDB và SingleStoreDB — chọn phương ngữ gần nhất tạo ra đầu ra hợp lý ngay cả khi mục tiêu chính xác không có trong danh sách. Định danh, chuỗi nghĩa đen và toán tử đặc thù của phương ngữ (PostgreSQL @>, tiền tố BigQuery SAFE.) được giữ nguyên vẹn.
Công cụ này có xác thực SQL của tôi không?
Không. Formatter là bộ viết lại từ vựng, không phải bộ phân tích cú pháp. Nó tokenize đầu vào, áp dụng quy tắc bố cục và phát ra kết quả; nó không kiểm tra truy vấn có hợp lệ về mặt ngữ nghĩa không, các bảng được tham chiếu có tồn tại không, hoặc cú pháp có hợp pháp trong phương ngữ đã chọn không. Chạy đầu ra đã định dạng qua cơ sở dữ liệu thực tế (hoặc SQL linter như SQLFluff) để kiểm tra tính đúng đắn thực sự.
Tại sao các từ khóa của tôi bị chuyển thành chữ hoa?
Dropdown kiểu chữ từ khóa mặc định là CHỮ HOA, đó là quy ước trong hầu hết các hướng dẫn phong cách SQL đã xuất bản (dbt Labs, Mode, GitLab). Chuyển sang chữ thường nếu nhóm của bạn viết select / from bằng chữ thường, hoặc Giữ nguyên nếu bạn muốn đầu ra giữ nguyên kiểu chữ bạn đã gõ. Định danh không bao giờ bị ảnh hưởng — chỉ tập từ khóa được nhận dạng là được viết lại.
Truy vấn của tôi có được tải lên nơi nào không?
Không. Thư viện sql-formatter đi kèm chạy trong trình duyệt, việc định dạng xảy ra cục bộ trên máy của bạn và văn bản truy vấn không bao giờ vượt qua mạng. Các yêu cầu gửi đi duy nhất trang này thực hiện là các yêu cầu phân tích và quảng cáo chia sẻ tương tự mà mọi trang trên tools.ultim8soft.com thực hiện; bản thân văn bản SQL không phải là một phần của bất kỳ yêu cầu nào.
SQL được in đẹp không còn là tranh luận về phong cách khi formatter xử lý nó. Công cụ chạy hoàn toàn trong trình duyệt, truy vấn không bao giờ rời khỏi trang và tokenizer nhận biết phương ngữ tương tự cung cấp năng lượng cho gói npm sql-formatter thực hiện việc viết lại.