この記事は公開から3年以上経過しています。
今回はVSCodeで選択範囲のSQLをフォーマットするVSCode Macros拡張のマクロを、db2/mariadb/mysql/n1ql/plsql/postgresql/redshift/spark/sql/tsqlに対応するnpmのSQLフォーマッタsql-formatter
を使って作成してみたので紹介します。
通常のフォーマッタ拡張を利用したフォーマットではドキュメント種別に対応したフォーマッタが適用されますが、このマクロの場合は選択部分に適用できますので、例えば「markdownのコードブロックに記述したSQLだけフォーマットしたい」のような利用も可能です。
マクロの動作イメージ
ちなみに現時点ではsql-formatter
がストアドのフォーマットに対応していない(フォーマットできますが期待どおりのフォーマットにならない場合がある)ため、ご注意ください。
参考ウェブサイトのGitHubリンクページにオンラインデモを体験できるサイトへのリンクがありますので、どのようなフォーマットになるか気になる方は導入前にテストしてみると良いかもしれません。
npmライブラリのインストール手順
以下の手順で、マクロから利用するnpmライブラリを導入しておきます。
-
マクロディレクトリに
package.json
が存在しない場合は、カレントをマクロディレクトリに移動して以下のコマンドでVSCodeMacrosで利用するプライベートnpmライブラリ用のpackage.json
を生成します(npmライブラリをグローバルインストールする場合は不要)。echo '{"private":true}' >> package.json
※Windowsのコマンドプロンプト(cmd.exe)の場合はシングルクォート
'
は不要。 -
以下のコマンドでsql-formatterをインストールします。
npm i sql-formatter
マクロのサンプルソースコード
const vscode = require('vscode');
const formatter = require('sql-formatter');
/**
* マクロコンフィギュレーション
*/
module.exports.macroCommands = {
SQLフォーマット: {
no: 1,
func: FormatSQL,
},
};
/**
* 選択SQLをフォーマット
*/
function FormatSQL() {
const editor = vscode.window.activeTextEditor;
if (!editor) {
vscode.window.showWarningMessage('Editor not found.');
return;
}
const document = editor.document;
if (!document) {
vscode.window.showWarningMessage('Document not found.');
return;
}
const selection = editor.selection;
// 選択されたSQLを取得
let text = document.getText(selection);
// SQLをフォーマット(language=db2, mariadb, mysql, n1ql, plsql, postgresql, redshift, spark, sql, tsql)
const replacedText = formatter.format(text, {
language: 'plsql',
indent: ' ',
uppercase: true
});
// フォーマット後のSQLで置換
editor.edit((editBuilder) => {
editBuilder.replace(selection, replacedText);
});
}
使い方
エディタ上でフォーマットしたいSQLを選択してマクロを実行すると、選択範囲のSQLをフォーマットします。
本マクロは個人的用途で連続でフォーマッタを適用する目的で即席で作成したもののため、対象SQLやフォーマットオプションがハードコーディングで決め打ちになっていますが、ご自身でマクロを改変することで設定を選択/保持するといった利用も可能です。
sql-formatter
で指定できるフォーマットオプションについては、下記参考ウェブサイトをご参照ください。
参考ウェブサイトなど
- GitHub
zeroturnaround/sql-formatter
以上です。