はじめに
コマンドラインからSQL文を整形できるツールを探していましたが、
あまり気に入ったものがなく困っていました。
以下のURLを見ると、HibernateのBasicFormatterImplクラスを使えば、
かんたんにSQL文を整形できることがわかりました。
Groovyの場合
Groovyの場合は非常に簡単で、1つのスクリプトファイルで実現できます。
/**
* 標準入力からSQL文を読み取り、整形したSQL文を標準出力に出力します。
*/
@Grab(group='org.hibernate', module='hibernate-core', version='5.2.3.Final')
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
def formatter = new BasicFormatterImpl()
String original = System.in.text
String formatted = formatter.format(original)
println formatted
以下のように実行します。
echo "SELECT * FROM HOGE WHERE HOGE.FUGA = :fuga" | groovy sql-formatter.groovy
このように表示されます。
SELECT
*
FROM
HOGE
WHERE
HOGE.FUGA = :fuga
Javaの場合
依存ライブラリをMaven等で設定しておけば、Groovyとほぼ変りません。
少々コードが冗長に見えますが、起動速度はこちらのほうが速いです。
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
public class SqlFormatter {
public static void main(String[] args) throws IOException {
Reader reader = new InputStreamReader(System.in);
Writer writer = new OutputStreamWriter(System.out);
int c;
StringBuilder sql = new StringBuilder(1024);
while ((c = reader.read()) != -1) {
sql.append((char) c);
}
String original = sql.toString();
String formatted = new BasicFormatterImpl().format(original);
writer.write(formatted);
writer.flush();
}
}
全ソースコード
以下に配置しています。