Pemformat SQL baris perintah yang berjalan di hampir semua lingkungan (selama node.js diinstal).
Ini didasarkan pada paket NPM Formatter T-SQL Orang Miskin (poor-mans-t-sql-formatter), yang pada gilirannya didasarkan pada perpustakaan C# dengan nama yang sama ( https://github.com/TaoK/PoorMansTSqlFormatter ).
Pemformat ini harus memiliki fungsionalitas yang setara dengan pemformat baris perintah C# yang telah ada selama beberapa tahun (dapat diunduh di http://architectshack.com/PoorMansTSqlFormatter.ashx), dengan dua perbedaan utama:
Sangat mudah untuk menginstal, terutama di lingkungan unixey - selama Node.js tersedia
Ini sedikit lebih lambat dibandingkan formatter berbasis .Net.
(dengan asumsi node.js diinstal)
npm install --global poor-mans-t-sql-formatter-cli
masukan pipa/stdin & keluaran stdout:
echo "select a from b join c on b.id = c.id where abc = 123 and def = N'whatêver' " | sqlformat
masukan & keluaran berkas:
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
Pemformat baris perintah ini akan keluar dengan kode keluar non-0 jika penguraian SQL "mendapat masalah" - misalnya jika menemukan pernyataan "IF" yang belum selesai, menunjukkan bahwa sesuatu tentang SQL tidak dipahami/diurai dengan benar, dan karena itu mungkin "terjadi salah". Ada opsi untuk menonaktifkan perilaku ini jika SQL diketahui mencurigakan, atau kebingungan penguraian diketahui tidak berbahaya.
Jika penguraian dibatalkan, "file keluaran" apa pun yang ditentukan tidak akan tersentuh.
Opsi khusus utilitas baris perintah:
Pilihan | Keterangan | Jenis | Bawaan |
---|---|---|---|
--berkas masukan | Baca input yang akan diformat dari file, bukan stdin (input yang diketik atau disalurkan) | rangkaian | |
--file keluaran | Tulis keluaran yang diformat ke file - seperti pengalihan shell stdout, kecuali jika terjadi kesalahan, file tidak tersentuh | rangkaian | |
--ignoreErrors | Kembalikan kode keluar 0 (berhasil) meskipun penguraian gagal (sehingga keluaran yang diformat mencurigakan) | bodoh | |
--pengkodean masukan | Gunakan pengkodean karakter tertentu yang didukung oleh node untuk input - pada dasarnya utf-16le atau utf-8 | rangkaian | utf-8 |
--pengkodean keluaran | Gunakan pengkodean karakter tertentu yang didukung oleh node untuk keluaran - pada dasarnya utf-16le atau utf-8 | rangkaian | utf-8 |
--forceOutputBOM | Tambahkan tanda urutan byte (BOM) ke awal keluaran | bodoh |
Opsi pemformat standar:
(harap dicatat, opsi boolean yang biasanya default ke "true" di perpustakaan telah dibalik dengan awalan "tidak", mengikuti konvensi parameter baris perintah unixey)
Pilihan | Keterangan | Jenis | Bawaan |
---|---|---|---|
--indentasi | Satuan indentasi - biasanya berupa tab (t) atau sejumlah spasi | rangkaian | T |
--maxLineWidth | Mintalah pemformat untuk membungkus garis panjang agar tidak melebihi panjang garis ini | ke dalam | 999 |
--spasiPerTab | Ini digunakan untuk mengukur panjang garis, dan hanya berlaku jika Anda menggunakan tab | ke dalam | 4 |
--pernyataan Istirahat | Berapa banyak linebreak yang harus ditambahkan saat memulai pernyataan baru? | ke dalam | 2 |
--clauseBreaks | Berapa banyak linebreak yang harus ditambahkan saat memulai klausa baru dalam sebuah pernyataan? | ke dalam | 1 |
--no-expandCommaLists | Haruskah daftar yang dipisahkan koma (kolom, kelompok berdasarkan argumen, dll) dipecah menjadi baris baru? | bodoh | |
--tanpa tanda koma | Saat memulai baris baru karena koma, apakah koma harus berada di akhir baris (VS di awal baris berikutnya)? | bodoh | |
--spaceAfterExpandedComma | Haruskah spasi ditambahkan setelah koma? (biasanya tidak jika mereka "mengikuti") | bodoh | |
--no-expandBooleanExpressions | Haruskah operator boolean (AND, OR) menyebabkan linebreak? | bodoh | |
--no-expandCaseStatements | Haruskah ekspresi CASE memiliki ekspresi WHEN dan THEN dipecah pada baris baru? | bodoh | |
--no-expandBetweenConditions | Haruskah ekspresi BETWEEN argumen maksimal dipecah pada baris baru? | bodoh | |
--expandInLists | Haruskah daftar IN() memiliki setiap argumen di baris baru? | bodoh | |
--breakJoinOnSections | Haruskah bagian ON dari klausa JOIN dipecah menjadi barisnya sendiri? | bodoh | |
--tidak ada kata kunci huruf besar | Haruskah kata kunci T-SQL (seperti SELECT, FROM) secara otomatis menggunakan huruf besar? | bodoh | |
--kata kunciStandarisasi | Haruskah kata kunci T-SQL yang kurang umum diganti dengan kata kunci standarnya? (CATATAN: hanya aman untuk T-SQL!) | bodoh |
Opsi pemformat ("perintah min") yang membingungkan:
Pilihan | Keterangan | Jenis | Bawaan |
---|---|---|---|
--acakKasus Kata Kunci | Haruskah kata kunci diacak, untuk meminimalkan keterbacaan? | bodoh | |
--acakPanjangGaris | Haruskah SQL dibungkus pada interval yang sewenang-wenang, untuk meminimalkan keterbacaan? | bodoh | |
--no-preserveKomentar | Haruskah komentar dalam kode dipertahankan (vs dihapus)? | bodoh | |
--aktifkanSubstitusi Kata Kunci | Haruskah kata kunci dengan sinonim menggunakan bentuk yang kurang umum? (CATATAN: hanya aman untuk T-SQL!) | bodoh |
Harap dicatat, alat baris perintah ini TIDAK saat ini menghasilkan keluaran HTML (disorot sintaksis). Ini akan menjadi fitur yang cukup sepele untuk ditambahkan, ini pasti didukung oleh perpustakaan yang mendasarinya, tapi saya belum melihat kasus penggunaan yang realistis. Jika Anda memilikinya, beri tahu saya (dan/atau fork, tambahkan opsi, beri tahu saya).
Pemformat ini secara efektif "mewarisi" semua fungsi perpustakaan Pemformat T-SQL Orang Miskin:
Dukungan penuh untuk MS SQL Server T-SQL, dengan (sejauh yang saya tahu) tidak ada kegagalan penguraian ** Termasuk dukungan prosedural/kode batch penuh, DDL, DML, dll.
Dukungan yang wajar untuk dialek SQL lainnya (biasanya digunakan untuk memformat kueri PL/SQL, PostgreSql, MySQL, dll) ** Konstruksi tertentu mungkin tidak berfungsi atau mungkin tidak disimpan dengan benar/tepat untuk dialek lain tersebut - harap ajukan masalah jika masalah tersebut teridentifikasi
Opsi konfigurasi pemformatan dalam jumlah yang wajar, dan masih banyak lagi yang akan segera hadir.
Sebagaimana dicatat dalam dokumen paket perpustakaan JS (https://github.com/TaoK/poor-mans-t-sql-formatter-npm-package), formatter ini agak lambat saat ini. Di laptop saya, memformat satu kueri saja memerlukan waktu sekitar setengah detik. Hal ini menunjukkan bahwa untuk beban kerja pemformatan massal, mungkin masuk akal untuk menawarkan opsi input/output file wildcard/rekursif.
Dukungan pengkodean juga sangat terbatas - karena kami menggunakan dukungan pengkodean bawaan node, dukungannya menjadi utf-8 atau utf-16le. Mungkin ada baiknya mengatasi hal ini dengan pustaka iconv-lite, namun menambahkan lebih banyak kode untuk dimuat juga akan memiliki kelemahan. Sesuatu untuk dipikirkan.
Selain hal-hal ini, saya tidak mengetahui adanya masalah besar yang belum terselesaikan (vs misalnya versi C#/.Net dari pemformat baris perintah yang sama ini dapat diunduh di http://architectshack.com/PoorMansTSqlFormatter.ashx), jadi masukan/fitur apa pun permintaan dipersilakan!