SQL Formatter เป็นไลบรารี JavaScript สำหรับการสืบค้น SQL แบบพิมพ์สวย
มันเริ่มต้นจากการเป็นพอร์ตของไลบรารี PHP แต่หลังจากนั้นก็มีความแตกต่างกันอย่างมาก
รองรับภาษา SQL ต่างๆ: GCP BigQuery, IBM DB2, Apache Hive, MariaDB, MySQL, TiDB, Couchbase N1QL, Oracle PL/SQL, PostgreSQL, Amazon Redshift, SingleStoreDB, Snowflake, Spark, SQL Server Transact-SQL, Trino (และ Presto ). ดูเอกสารตัวเลือกภาษาสำหรับรายละเอียดเพิ่มเติม
มันไม่สนับสนุน:
;
-→ ลองสาธิต
รับเวอร์ชันล่าสุดจาก NPM:
npm install sql-formatter
มีให้เลือกทั้งแบบเส้นด้าย:
yarn add sql-formatter
import { format } from 'sql-formatter' ;
console . log ( format ( 'SELECT * FROM tbl' , { language : 'mysql' } ) ) ;
สิ่งนี้จะส่งออก:
SELECT
*
FROM
tbl
คุณยังสามารถส่งตัวเลือกการกำหนดค่าได้:
format ( 'SELECT * FROM tbl' , {
language : 'spark' ,
tabWidth : 2 ,
keywordCase : 'upper' ,
linesBetweenQueries : 2 ,
} ) ;
คุณสามารถปิดการใช้งานฟอร์แมตเตอร์สำหรับส่วนของ SQL ได้โดยล้อมรอบมันด้วยปิดการใช้งาน/เปิดใช้งานความคิดเห็น:
/* sql-formatter-disable */
SELECT * FROM tbl1;
/* sql-formatter-enable */
SELECT * FROM tbl2;
ซึ่งผลิต:
/* sql-formatter-disable */
SELECT * FROM tbl1;
/* sql-formatter-enable */
SELECT
*
FROM
tbl2;
ฟอร์แมตเตอร์ไม่ได้แยกวิเคราะห์โค้ดระหว่างความคิดเห็นเหล่านี้ด้วยซ้ำ ดังนั้นในกรณีที่มี SQL บางตัวเกิดขึ้นกับ SQL Formatter ที่ขัดข้อง คุณสามารถแสดงความคิดเห็นเกี่ยวกับผู้กระทำผิดได้ (อย่างน้อยก็จนกว่าปัญหาจะได้รับการแก้ไขใน SQL Formatter)
นอกเหนือจากการจัดรูปแบบแล้ว ไลบรารีนี้ยังสามารถดำเนินการแทนที่ตัวยึดตำแหน่งในคำสั่ง SQL ที่เตรียมไว้:
format ( 'SELECT * FROM tbl WHERE foo = ?' , {
params : [ "'bar'" ] ,
} ) ;
ผลลัพธ์ใน:
SELECT
*
FROM
tbl
WHERE
foo = ' bar '
สำหรับรายละเอียดเพิ่มเติม โปรดดูเอกสารตัวเลือกพารามิเตอร์
เครื่องมือ CLI จะถูกติดตั้งภายใต้ sql-formatter
และอาจถูกเรียกใช้ผ่าน npx sql-formatter
:
sql-formatter -h
usage: sql-formatter [-h] [-o OUTPUT]
[-l {bigquery,db2,db2i,hive,mariadb,mysql,n1ql,plsql,postgresql,redshift,singlestoredb,snowflake,spark,sql,sqlite,tidb,transactsql,trino,tsql}] [-c CONFIG] [--version] [FILE]
SQL Formatter
positional arguments:
FILE Input SQL file (defaults to stdin)
optional arguments:
-h, --help show this help message and exit
-o, --output OUTPUT
File to write SQL output (defaults to stdout)
--fix Update the file in-place
-l, --language {bigquery,db2,db2i,hive,mariadb,mysql,n1ql,plsql,postgresql,redshift,singlestoredb,snowflake,spark,sql,sqlite,tidb,trino,tsql}
SQL dialect (defaults to basic sql)
-c, --config CONFIG
Path to config JSON file or json string (will find a file named '.sql-formatter.json' or use default configs if unspecified)
--version show program's version number and exit
ตามค่าเริ่มต้น เครื่องมือจะรับคำสั่งจาก stdin และประมวลผลเป็น stdout แต่สามารถตั้งชื่อไฟล์อินพุตหรือใช้ตัวเลือก --output
ได้
echo ' select * from tbl where id = 3 ' | sql-formatter
select
*
from
tbl
where
id = 3
เครื่องมือนี้ยังยอมรับไฟล์กำหนดค่า JSON ชื่อ .sql-formatter.json ในไดเรกทอรีปัจจุบันหรือไดเรกทอรีหลัก หรือด้วยตัวเลือก --config
ที่ใช้แบบฟอร์มนี้:
{
"language" : " spark " ,
"tabWidth" : 2 ,
"keywordCase" : " upper " ,
"linesBetweenQueries" : 2
}
ฟิลด์ทั้งหมดเป็นทางเลือก และฟิลด์ทั้งหมดที่ไม่ได้ระบุจะถูกกรอกด้วยค่าเริ่มต้น
language
ถิ่น SQL ที่จะใช้ (เมื่อใช้ format()
)dialect
ถิ่น SQL ที่จะใช้ (เมื่อใช้ formatDialect()
ตั้งแต่เวอร์ชัน 12)tabWidth
จำนวนการเยื้องที่จะใช้useTabs
เพื่อใช้แท็บสำหรับการเยื้องkeywordCase
ตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กคำหลักdataTypeCase
ตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กชนิดข้อมูลfunctionCase
ใหญ่หรือตัวพิมพ์เล็ก functionCaseidentifierCase
ตัวระบุตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก ( ทดลอง! )indentStyle
กำหนดสไตล์การเยื้องโดยรวม ( เลิกใช้แล้ว! )logicalOperatorNewline
ขึ้นบรรทัดใหม่ก่อนหรือหลังตัวดำเนินการบูลีน (AND, OR, XOR)expressionWidth
จำนวนอักขระสูงสุดในนิพจน์วงเล็บที่จะเก็บไว้ในบรรทัดเดียวlinesBetweenQueries
จำนวนบรรทัดใหม่ที่จะแทรกระหว่างแบบสอบถามdenseOperators
แพ็คตัวดำเนินการอย่างหนาแน่นโดยไม่มีช่องว่างnewlineBeforeSemicolon
จะวางเครื่องหมายอัฒภาคบนบรรทัดแยกกันparams
ของค่าสำหรับการแทนที่ตัวยึดตำแหน่งparamTypes
ระบุประเภทตัวยึดพารามิเตอร์ที่จะสนับสนุน หากคุณไม่ได้ใช้บันเดิลโมดูล ให้โคลนพื้นที่เก็บข้อมูล รัน npm install
และดึงไฟล์จากไดเร็กทอรี /dist
เพื่อใช้ภายในแท็ก <script>
สิ่งนี้ทำให้ SQL Formatter พร้อมใช้งานเป็นตัวแปรส่วนกลาง window.sqlFormatter
สาเหตุที่พบบ่อยที่สุดคือคุณไม่ได้ระบุภาษา SQL แทนที่จะโทรหาห้องสมุดง่ายๆ:
format ( 'select [col] from tbl' ) ;
// Throws: Parse error: Unexpected "[col] from" at line 1 column 8
เลือกภาษาถิ่นที่เหมาะสม เช่น:
format ( 'select [col] from tbl' , { language : 'transactsql' } ) ;
หรือเมื่อใช้ส่วนขยาย VSCode: การตั้งค่า -> SQL-Formatter-VSCode: SQLFlavourOverride
ซึ่งมักเกิดขึ้นเมื่อรวมแอปพลิเคชันเข้ากับ Webpack สาเหตุคือ Babel (ผ่าน babel-loader
) ไม่ได้กำหนดค่าให้รองรับไวยากรณ์คุณสมบัติคลาส:
| export default class ExpressionFormatter {
> inline = false;
ไวยากรณ์นี้รองรับอย่างกว้างขวางในเบราว์เซอร์หลักทั้งหมด (ยกเว้น IE เก่า) และรองรับรวมอยู่ในค่าเริ่มต้น @babel/preset-env
การแก้ไขที่เป็นไปได้:
@babel/preset-env
@babel/plugin-proposal-class-properties
ส่วนขยาย Prettier SQL VSCode ไม่ได้รับการดูแลโดยผู้เขียนอีกต่อไป
โปรดใช้ส่วนขยาย VSCode ของ SQL Formatter อย่างเป็นทางการเพื่อรับการแก้ไขล่าสุดจากไลบรารี SQL Formatter
ตัวอย่างเช่น คุณอาจมี SQL เช่น:
SELECT {col1}, {col2} FROM {tablename}
แม้ว่า SQL Formatter จะไม่รองรับการสร้างเทมเพลตโดยตรง แต่วิธีแก้ปัญหาคือใช้ตัวเลือกการกำหนดค่า paramTypes เพื่อรักษาเหตุการณ์ที่เกิดขึ้นของโครงสร้างเทมเพลตเป็นตัวยึดตำแหน่งพารามิเตอร์คำสั่งที่เตรียมไว้:
format ( 'SELECT {col1}, {col2} FROM {tablename};' , {
paramTypes : { custom : [ { regex : String . raw `{w+}` } ] } ,
} ) ;
สิ่งนี้ใช้ไม่ได้กับโครงสร้างเทมเพลตที่เป็นไปได้ทั้งหมด แต่ควรแก้ไขกรณีการใช้งานที่พบบ่อยที่สุด
ขณะนี้การพัฒนาฟอร์แมตเตอร์นี้อยู่ในโหมดการบำรุงรักษา ข้อบกพร่องจะได้รับการแก้ไขหากเป็นไปได้ แต่คุณสมบัติใหม่มีแนวโน้มที่จะไม่ได้รับการเพิ่ม
ฉันได้เริ่มเครื่องมือการจัดรูปแบบ SQL ใหม่: prettier-plugin-sql-cst
ลองใช้ดูหากคุณต้องการยกระดับการจัดรูปแบบอัตโนมัติของ SQL ไปอีกระดับ
โปรดดูที่ CONTRIBUTING.md
เอ็มไอที