7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQL文を整形する

Posted at

はじめに

コマンドラインから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();
    }
}

全ソースコード

以下に配置しています。

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?