ほぼすべての環境 (node.js がインストールされている限り) で実行できるコマンドライン SQL フォーマッタ。
これは Poor Man's T-SQL Formatter NPM パッケージ (poor-mans-t-sql-formatter) に基づいており、このパッケージは同じ名前の C# ライブラリ (https://github.com/TaoK/PoorMansTSqlFormatter) に基づいています。 )。
このフォーマッタは、数年前から存在している C# コマンド ライン フォーマッタ (http://architectshack.com/PoorMansTSqlFormatter.ashx からダウンロード可能) と機能的には同等ですが、次の 2 つの大きな違いがあります。
Node.js が利用可能な限り、特に unixey 環境ではインストールが非常に簡単です。
.Net ベースのフォーマッタよりもかなり遅いです。
(node.jsがインストールされていると仮定します)
npm install --global poor-mans-t-sql-formatter-cli
パイプ/標準入力および標準出力出力:
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
このコマンド ライン フォーマッタは、SQL 解析が「問題を起こした」場合、0 以外の終了コードで終了します。たとえば、未完了の「IF」ステートメントに遭遇した場合は、SQL に関する何かが正しく理解/解析されていないことを示唆しています。したがって、「間違っている」可能性があります。 SQL が怪しいことがわかっている場合、または解析の混乱が無害であることがわかっている場合は、この動作を無効にするオプションがあります。
解析が中止された場合、指定された「出力ファイル」はそのまま残ります。
コマンドラインユーティリティ固有のオプション:
オプション | 説明 | タイプ | デフォルト |
---|---|---|---|
--inputFile | 標準入力ではなくファイルからフォーマットされる入力を読み取ります (入力またはパイプ入力)。 | 弦 | |
--outputFile | フォーマットされた出力をファイルに書き込みます - 標準出力のシェル リダイレクトと同様ですが、エラーが発生した場合はファイルはそのまま残ります。 | 弦 | |
--ignoreErrors | 解析が失敗した場合でも、0 (成功) 終了コードを返します (したがって、フォーマットされた出力は疑わしい) | ブール | |
--inputEncoding | ノードでサポートされている特定の文字エンコーディングを入力に使用します - 基本的に utf-16le または utf-8 | 弦 | UTF-8 |
--outputEncoding | 出力にはノードでサポートされている特定の文字エンコーディングを使用します - 基本的に utf-16le または utf-8 | 弦 | UTF-8 |
--forceOutputBOM | 出力の先頭にバイト オーダー マーク (BOM) を追加します。 | ブール |
標準のフォーマッタ オプション:
(ライブラリ内で通常はデフォルトで "true" になるブール型オプションは、unixey コマンドライン パラメータ規則に従って、"no" プレフィックスで反転されていることに注意してください)
オプション | 説明 | タイプ | デフォルト |
---|---|---|---|
- インデント | インデントの単位 - 通常はタブ (t) またはスペースの数 | 弦 | t |
--maxLineWidth | この行の長さを超えないように、長い行を折り返すようフォーマッタに要求します。 | 整数 | 999 |
--タブごとのスペース | これは線の長さを測定するために使用され、タブを使用する場合にのみ適用されます。 | 整数 | 4 |
--statementBreak | 新しいステートメントを開始するときに改行を何回追加する必要がありますか? | 整数 | 2 |
--clauseBreak | ステートメント内で新しい句を開始する場合、改行を何回追加する必要がありますか? | 整数 | 1 |
--no-expandCommaLists | カンマ区切りのリスト (列、引数によるグループ化など) は新しい行に分割する必要がありますか? | ブール | |
--末尾のカンマなし | カンマを使用して新しい行を開始する場合、カンマは行末 (VS 次の行の先頭) に置く必要がありますか? | ブール | |
--spaceAfterExpandedComma | カンマの後にスペースを追加する必要がありますか? (通常、「追跡」している場合はそうではありません) | ブール | |
--no-expandBooleanExpressions | ブール演算子 (AND、OR) は改行を引き起こす必要がありますか? | ブール | |
--no-expandCaseStatements | CASE 式の WHEN 式と THEN 式は新しい行に分割する必要がありますか? | ブール | |
--no-expandBetweenConditions | BETWEEN 式では、max 引数を新しい行に分割する必要がありますか? | ブール | |
--expandInLists | IN() リストでは各引数を新しい行に置く必要がありますか? | ブール | |
--breakJoinOnSections | JOIN 句の ON セクションを独自の行に分割する必要がありますか? | ブール | |
--no-uppercaseキーワード | T-SQL キーワード (SELECT、FROM など) は自動的に大文字にされるべきですか? | ブール | |
--キーワード標準化 | あまり一般的ではない T-SQL キーワードを標準のキーワードに置き換えるべきでしょうか? (注意: T-SQL に対してのみ安全です!) | ブール |
難読化フォーマッタ (「min」コマンド) オプション:
オプション | 説明 | タイプ | デフォルト |
---|---|---|---|
--randomizeKeywordCase | 読みやすさを最小限に抑えるために、キーワードの大文字と小文字をランダムにする必要がありますか? | ブール | |
--randomizeLineLengths | 読みやすさを最小限に抑えるために、SQL を任意の間隔でラップする必要がありますか? | ブール | |
--no-preserveコメント | コード内のコメントは (削除されるのではなく) 保持されるべきでしょうか? | ブール | |
--enableKeywordSubstitution | 同義語を含むキーワードでは、あまり一般的ではない形式を使用する必要がありますか? (注意: T-SQL に対してのみ安全です!) | ブール |
このコマンドライン ツールは現在、HTML (構文が強調表示された) 出力を生成しないことに注意してください。これは追加するのがかなり簡単な機能であり、基盤となるライブラリによって確実にサポートされていますが、現実的な使用例は見たことがありません。持っている場合は、お知らせください (および/またはフォークし、オプションを追加して、お知らせください)。
このフォーマッタは、Poor Man's T-SQL Formatter ライブラリのすべての機能を事実上「継承」しています。
MS SQL Server T-SQL を完全にサポートし、(私の知る限り)解析エラーはありません ** 完全な手続き型/バッチ コードのサポート、DDL、DML などを含みます。
他の SQL 言語に対する合理的なサポート (PL/SQL、PostgreSql、MySQL などのクエリのフォーマットに通常使用されます) ** 特定の構造が他の言語に対して機能しない、または正しく/忠実に保存されない可能性があります - そのような懸念が特定された場合は、問題を報告してください。
適切な数の書式設定オプションがあり、さらに多くのオプションが追加される予定です。
JS ライブラリ パッケージのドキュメント (https://github.com/TaoK/poor-mans-t-sql-formatter-npm-package) に記載されているように、このフォーマッタは現時点ではかなり遅いです。私のラップトップでは、単一のクエリをフォーマットするのに約 0.5 秒かかります。これは、一括フォーマットのワークロードの場合、ワイルドカード/再帰的なファイル入出力オプションを提供することが合理的である可能性があることを示唆しています。
エンコーディングのサポートも非常に限定されています。ノードの組み込みエンコーディング サポートを使用するため、utf-8 または utf-16le になります。 iconv-lite ライブラリを使用してこれに対処することは価値があるかもしれませんが、さらに多くのコードを追加して読み込むことには欠点もあります。考えるべきことがある。
これら以外に、私は大きな未解決の懸念事項を認識していません (たとえば、http://architectshack.com/PoorMansTSqlFormatter.ashx でダウンロードできるこの同じコマンドライン フォーマッタの C# / .Net バージョンと比較して) ため、入力/機能はすべてリクエストも大歓迎です!