Personal tools
You are here: Home ブログ matsuyama Emacs で SQL を整形する
Document Actions

Emacs で SQL を整形する

perltidy を使ってみたり(*)、 elisp を使ってみたりして SQL を整形する方法を模索していましたが、最終的に専用のバックエンドを使うのが一番うまくいったので、それを紹介します。

(*) 文字列連結演算子の改行の扱いをうまく制御できなかった

バックエンドの準備

バックエンドとして blancoSqlFormatter というライブラリを使います(*)。

(*) http://sourceforge.jp/projects/blancofw/files/?release_id=27764#27764

Java のライブラリです。休日ハックに Java を使うとすごく不愉快になるのはなぜでしょうか。まあいいです。

% mkdir ~/opt
% unzip balcoSqlFormatter-0.1.0.src.zip -d ~/opt

Java のクライアントを書きます。

~/opt/blancoSqlFormatter/SqlBeautify.java:

import java.io.InputStream;

import blanco.commons.sql.format.BlancoSqlFormatter;
import blanco.commons.sql.format.BlancoSqlRule;

public class SqlBeautify {
    public static void main(String[] args) throws Exception {
        InputStream is = System.in;
        StringBuilder sb = new StringBuilder();
        byte[] buffer = new byte[4096];
        int read;
        while ((read = is.read(buffer)) != -1) {
            sb.append(new String(buffer, 0, read));
        }
        System.out.println(new BlancoSqlFormatter(new BlancoSqlRule()).format(sb.toString()));
    }
}

コンパイルします。

% cd ~/opt/blancoSqlFormatter
% CLASSPATH=$CLASSPATH:blancosqlformatter-0.1.0.jar javac SqlBeautify.java

シェルスクリプトのバックエンドを書きます。

~/bin/sqlbeautify:

#!/bin/sh

BSF_HOME=$HOME/opt/blancoSqlFormatter
BSF_LIB=$BSF_HOME/blancosqlformatter-0.1.0.jar

env CLASSPATH=$CLASSPATH:$BSF_HOME:$BSF_LIB java SqlBeautify

実行可能にします。

% chmod +x ~/bin/sqlbeautify

こんな感じに使います。

% echo ”SELECT name,value FROM v\$sysstat WHERE name IN ('db block gets','consistent gets', 'physical reads');” | sqlbeautify
SELECT
        name
        ,VALUE
    FROM
        v$sysstat
    WHERE
        name IN (
            'db block gets'
            ,'consistent gets'
            ,'physical reads'
        )
;

Emacs から使う

以下の関数を記述します。

~/.emacs:

(defun sql-beautify-region (start end)
  "Beautify SQL in region between START and END."
  (interactive "r")
  (save-excursion
    (shell-command-on-region start end "sqlbeautify" nil t)))

(defun sql-beautify-buffer ()
 "Beautify SQL in buffer."
 (interactive)
 (sql-beautify-region (point-min) (point-max)))

M-x sql-beautify-buffer とか M-x sql-beautify-region で使えます。

Category(s)
linux
emacs
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/matsuyama/sql-beautifying-in-emacs/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.