風待ち

プログラミングの勉強や日々の出来事のログなど

emacsの*scratch*バッファでテンプレートエンジンのmustache.elを使って雑にSQLを作ってみる。

mustache.elを見つけたので使ってみる。

Emacs Lisp自体ほとんどわかっていないので勉強もかねてやってみた。

*scratch*バッファだから、順番に”C-j”して実行して行けば、テンプレートの{{key}}で書かれたところを埋めたSQLが手に入る。

利用したライブラリは下記の3つ

*scratch*バッファ

;;テンプレートを作る
(setq template "
update users set user_id = '{{new-id}}' where user_id = '{{old-id}}';
delete from item_info where user_id = '{{old-id}}';
")

;;ハッシュテーブルを作る
(require 'ht)
(setq context (list
           (ht ("new-id" "new-foo") ("old-id" "old-foo"))
           (ht ("new-id" "new-bar") ("old-id" "old-bar"))
           (ht ("new-id" "new-baz") ("old-id" "old-baz"))))

;;SQLをmustache.elで作る
(require 'dash)
(require 'mustache)

(-map (lambda (m) (princ (mustache-render template m))) context)

;;再帰でもやってみる
(defun my-render (tmpl lst)
  (cond
   ((null lst) (princ "commit;\n"))
   (t (progn
    (princ (mustache-render tmpl (car lst)))
    (my-render tmpl (cdr lst))))))

(my-render template context)

業務で単純なSQLをたくさん書かないと行けない時は、Excelを使って作っている。

ただ、Excelだと一対一のSQLは作りやすいけど、一つのキーで複数のテーブルを更新しに行く一対多のSQLは作りづらいから、こういうやり方も覚えておくと便利かもしれない。

追記

READMEを読んだら、リストをループさせるテンプレートの書き方も載ってた。

当たり前だけど、公開されているドキュメントは一通り見ておいて損はないね。

(require 'mustache)
mustache

(require 'ht)
ht

(mustache-render "
{{#hoge-list}}
* {{hoge}}
{{/hoge-list}}
"
         (ht ("hoge-list"
              (list
               (ht ("hoge" "hogehoge1"))
               (ht ("hoge" "hogehoge2"))))))
"
* hogehoge1
* hogehoge2
"