ตัวจัดรูปแบบ SQL บรรทัดคำสั่งที่ทำงานในทุกสภาพแวดล้อม (ตราบใดที่ติดตั้ง node.js)
มันขึ้นอยู่กับแพ็คเกจ NPM ของ T-SQL Formatter ของ Poor Man (poor-mans-t-sql-formatter) ซึ่งในทางกลับกันจะขึ้นอยู่กับไลบรารี C # ที่มีชื่อเดียวกัน ( https://github.com/TaoK/PoorMansTSqlFormatter ).
ฟอร์แมตเตอร์นี้ควรจะเทียบเท่าในการทำงานกับฟอร์แมตเตอร์บรรทัดคำสั่ง C# ที่มีอยู่ไม่กี่ปี (ดาวน์โหลดได้ที่ http://architectshack.com/PoorMansTSqlFormatter.ashx) โดยมีข้อแตกต่างที่สำคัญสองประการ:
ติดตั้งง่ายมาก โดยเฉพาะในสภาพแวดล้อม Unixey ตราบใดที่ Node.js พร้อมใช้งาน
มันช้ากว่าฟอร์แมตเตอร์ที่ใช้ .Net เล็กน้อย
(สมมติว่าติดตั้ง node.js แล้ว)
npm install --global poor-mans-t-sql-formatter-cli
อินพุตแบบไปป์/stdin และเอาต์พุต stdout:
echo "select a from b join c on b.id = c.id where abc = 123 and def = N'whatêver' " | sqlformat
อินพุตและเอาต์พุตไฟล์:
echo "with a as (select 1 as b) select * from a cros join c" > testfile.sql sqlformat -f testfile.sql -g testfile.sql cat testfile.sql
ตัวจัดรูปแบบบรรทัดคำสั่งนี้จะออกด้วยโค้ดทางออกที่ไม่ใช่ 0 หากการแยกวิเคราะห์ SQL "ประสบปัญหา" - ตัวอย่างเช่น หากพบคำสั่ง "IF" ที่ยังไม่เสร็จ ซึ่งบ่งบอกว่ามีบางอย่างเกี่ยวกับ SQL ไม่เข้าใจ/แยกวิเคราะห์อย่างถูกต้อง และ จึงอาจ "ออกมาผิด" ได้ มีตัวเลือกในการปิดใช้งานพฤติกรรมนี้หากทราบว่า SQL มีความร่มรื่น หรือความสับสนในการแยกวิเคราะห์นั้นไม่เป็นอันตราย
หากการแยกวิเคราะห์ถูกยกเลิก "ไฟล์เอาต์พุต" ที่ระบุจะไม่ถูกแตะต้อง
ตัวเลือกเฉพาะยูทิลิตี้บรรทัดคำสั่ง:
ตัวเลือก | คำอธิบาย | พิมพ์ | ค่าเริ่มต้น |
---|---|---|---|
--inputFile | อ่านอินพุตที่จะจัดรูปแบบจากไฟล์แทนที่จะเป็น stdin (อินพุตที่พิมพ์หรือไพพ์) | เชือก | |
--outputFile | เขียนเอาต์พุตที่จัดรูปแบบแล้วไปยังไฟล์ - เช่นเดียวกับการเปลี่ยนเส้นทางเชลล์ของ stdout ยกเว้นในกรณีที่เกิดข้อผิดพลาด ไฟล์นั้นไม่ถูกแตะต้อง | เชือก | |
--ignoreErrors | ส่งคืนโค้ดทางออก 0 (สำเร็จ) แม้ว่าการแยกวิเคราะห์จะล้มเหลว (และดังนั้นจึงสงสัยว่าเอาต์พุตที่จัดรูปแบบแล้ว) | บูล | |
--การเข้ารหัสอินพุต | ใช้การเข้ารหัสอักขระเฉพาะที่โหนดรองรับสำหรับการป้อนข้อมูล - โดยทั่วไปคือ utf-16le หรือ utf-8 | เชือก | utf-8 |
--การเข้ารหัสเอาท์พุท | ใช้การเข้ารหัสอักขระเฉพาะที่โหนดรองรับสำหรับเอาต์พุต - โดยทั่วไปคือ utf-16le หรือ utf-8 | เชือก | utf-8 |
--forceOutputBOM | เพิ่มเครื่องหมายลำดับไบต์ (BOM) ไปที่จุดเริ่มต้นของเอาต์พุต | บูล |
ตัวเลือกฟอร์แมตเตอร์มาตรฐาน:
(โปรดทราบว่า ตัวเลือกบูลีนที่ปกติแล้วใช้ค่าเริ่มต้นเป็น "จริง" ในไลบรารี ได้ถูกพลิกด้วยคำนำหน้า "ไม่" ตามแบบแผนพารามิเตอร์บรรทัดคำสั่ง Unixey)
ตัวเลือก | คำอธิบาย | พิมพ์ | ค่าเริ่มต้น |
---|---|---|---|
--เยื้อง | หน่วยของการเยื้อง - โดยทั่วไปจะเป็นแท็บ (t) หรือช่องว่างจำนวนหนึ่ง | เชือก | ที |
--maxLineWidth | ขอให้ฟอร์แมตเตอร์ตัดบรรทัดยาวๆ เพื่อหลีกเลี่ยงไม่ให้เกินความยาวของบรรทัดนี้ | ภายใน | 999 |
--spacesPerTab | ใช้เพื่อวัดความยาวของเส้น และใช้ได้เฉพาะเมื่อคุณใช้แท็บเท่านั้น | ภายใน | 4 |
--statementBreaks | ควรเพิ่มการแบ่งบรรทัดจำนวนเท่าใดเมื่อเริ่มต้นคำสั่งใหม่ | ภายใน | 2 |
--clauseBreaks | ควรเพิ่มการแบ่งบรรทัดจำนวนเท่าใดเมื่อเริ่มต้นส่วนคำสั่งใหม่ภายในคำสั่ง | ภายใน | 1 |
--no-expandCommaLists | รายการที่คั่นด้วยเครื่องหมายจุลภาค (คอลัมน์ จัดกลุ่มตาม args ฯลฯ) ควรแยกออกเป็นบรรทัดใหม่หรือไม่ | บูล | |
--ไม่มีเครื่องหมายจุลภาคต่อท้าย | เมื่อขึ้นบรรทัดใหม่ด้วยลูกน้ำ ควรให้ลูกน้ำอยู่ท้ายบรรทัด (เทียบกับจุดเริ่มต้นของบรรทัดถัดไป) | บูล | |
--spaceAfterExpandedComma | ควรเพิ่มช่องว่างหลังเครื่องหมายจุลภาคหรือไม่ (โดยทั่วไปจะไม่เป็นเช่นนั้นหากเป็น "ต่อท้าย") | บูล | |
--no-expandBooleanExpressions | ตัวดำเนินการบูลีน (AND, OR) ควรทำให้เกิดการแตกบรรทัดหรือไม่ | บูล | |
--no-expandCaseStatements | นิพจน์ CASE ควรมีการแบ่งนิพจน์ WHEN และ THEN ในบรรทัดใหม่หรือไม่ | บูล | |
--ไม่มีการขยายระหว่างเงื่อนไข | นิพจน์ BETWEEN ควรมีอาร์กิวเมนต์สูงสุดแยกออกจากบรรทัดใหม่หรือไม่ | บูล | |
--expandInLists | รายการ IN() ควรมีแต่ละอาร์กิวเมนต์ในบรรทัดใหม่หรือไม่ | บูล | |
--breakJoinOnSections | ส่วน ON ของส่วนคำสั่ง JOIN ควรแยกย่อยออกเป็นบรรทัดของตัวเองหรือไม่? | บูล | |
--ไม่มีคำหลักตัวพิมพ์ใหญ่ | คำหลัก T-SQL (เช่น SELECT, FROM) ควรเป็นตัวพิมพ์ใหญ่โดยอัตโนมัติหรือไม่ | บูล | |
--คำหลักมาตรฐาน | ควรแทนที่คีย์เวิร์ด T-SQL ที่ไม่ค่อยพบบ่อยด้วยคีย์เวิร์ดมาตรฐานหรือไม่ (หมายเหตุ: ปลอดภัยสำหรับ T-SQL เท่านั้น!) | บูล |
ตัวเลือกฟอร์แมตเตอร์ที่สร้างความสับสน (คำสั่ง "min"):
ตัวเลือก | คำอธิบาย | พิมพ์ | ค่าเริ่มต้น |
---|---|---|---|
--randomizeKeywordCase | กรณีของคีย์เวิร์ดควรได้รับการสุ่มเพื่อลดความชัดเจนหรือไม่ | บูล | |
--randomizeLineLengths | ควรรวม SQL ในช่วงเวลาใด ๆ เพื่อลดความชัดเจนหรือไม่ | บูล | |
--ไม่มีการเก็บรักษาความคิดเห็น | ความคิดเห็นในโค้ดควรถูกเก็บไว้ (เทียบกับถูกถอดออก) หรือไม่ | บูล | |
--เปิดใช้งานการทดแทนคำหลัก | คำหลักที่มีคำพ้องความหมายควรใช้รูปแบบที่ใช้กันทั่วไปน้อยกว่าหรือไม่ (หมายเหตุ: ปลอดภัยสำหรับ T-SQL เท่านั้น!) | บูล |
โปรดทราบว่าเครื่องมือบรรทัดคำสั่งนี้ไม่ได้สร้างเอาต์พุต HTML (เน้นไวยากรณ์) ในปัจจุบัน นี่อาจเป็นคุณสมบัติที่ไม่สำคัญที่จะเพิ่ม เนื่องจากได้รับการสนับสนุนจากไลบรารีพื้นฐาน แต่ฉันไม่เคยเห็นกรณีการใช้งานจริงใด ๆ หากคุณมี โปรดแจ้งให้เราทราบ (และ/หรือทางแยก เพิ่มตัวเลือก แจ้งให้เราทราบ)
ตัวจัดรูปแบบนี้ "สืบทอด" ฟังก์ชั่นทั้งหมดของไลบรารีตัวจัดรูปแบบ T-SQL ของ Poor Man อย่างมีประสิทธิภาพ:
รองรับ MS SQL Server T-SQL อย่างสมบูรณ์ โดย (เท่าที่ฉันรู้) ไม่มีความล้มเหลวในการแยกวิเคราะห์ ** รวมถึงการสนับสนุนโค้ดขั้นตอน/แบทช์แบบเต็ม, DDL, DML ฯลฯ
การสนับสนุนที่สมเหตุสมผลสำหรับภาษาถิ่น SQL อื่น ๆ (มักใช้เพื่อจัดรูปแบบคำสั่ง PL/SQL, PostgreSql, MySQL ฯลฯ ) ** โครงสร้างเฉพาะอาจไม่ทำงานหรืออาจไม่ได้รับการเก็บรักษาไว้อย่างถูกต้อง/ซื่อสัตย์สำหรับภาษาถิ่นอื่น ๆ เหล่านั้น - โปรดแจ้งปัญหาเมื่อมีการระบุข้อกังวลดังกล่าว
ตัวเลือกการกำหนดค่าการจัดรูปแบบจำนวนที่เหมาะสม และยังมีอีกมากมายในเร็วๆ นี้
ตามที่ระบุไว้ในเอกสารแพ็คเกจไลบรารี JS (https://github.com/TaoK/poor-mans-t-sql-formatter-npm-package) ฟอร์แมตเตอร์นี้ค่อนข้าง ช้า ในขณะนี้ บนแล็ปท็อปของฉัน การจัดรูปแบบข้อความค้นหาเดียวจะใช้เวลาประมาณครึ่งวินาที นั่นแสดงให้เห็นว่าสำหรับการจัดรูปแบบปริมาณงานจำนวนมาก อาจสมเหตุสมผลที่จะเสนอตัวเลือกอินพุต/เอาท์พุตไฟล์ไวด์การ์ด/แบบเรียกซ้ำ
การรองรับการเข้ารหัสยังมีข้อจำกัดมาก เนื่องจากเราใช้การรองรับการเข้ารหัสในตัวของโหนด จึงเหลือเพียง utf-8 หรือ utf-16le มันอาจจะคุ้มค่าที่จะจัดการกับสิ่งนี้ด้วยไลบรารี iconv-lite แต่การเพิ่มโค้ดเพิ่มเติมเพื่อโหลดก็อาจมีข้อเสียเช่นกัน มีบางอย่างที่ต้องคิดเกี่ยวกับ
นอกเหนือจากสิ่งเหล่านี้ ฉันไม่ทราบถึงข้อกังวลที่สำคัญใดๆ (เทียบกับเช่นเวอร์ชัน C# / .Net ของตัวจัดรูปแบบบรรทัดคำสั่งเดียวกันนี้ซึ่งสามารถดาวน์โหลดได้ที่http://architectshack.com/PoorMansTSqlFormatter.ashx) ดังนั้นอินพุต / คุณสมบัติใด ๆ ยินดีต้อนรับคำขอ!