Common Lispでmigrationが簡単に行えるライブラリをcl-mgrを作ったの紹介します。
初めに
Lispに関してはまだまだ初心者ですので、間違いがあればぜひご指摘ください。すごく喜びます。
最後にできていないこと、できなかったことを
まとめているのでご指導していただければ嬉しいです。
cl-mgr とは
cl-mgr is a migration system like Ruby on Rails.
Ruby on Ralsのようにmigrationを通じて、
簡単にデータベースに変更を加えることができる
ライブラリです。
データベースとの接続やクエリの実行は、
fukamachiさんのcl-dbiを利用しました。
install
asdfを使って読み込みます。
(asdf:load-system :mgr)
how to use
;; データベースとの接続
(mgr:connect-db "mysql" "database-name" "username" "password")
;; migrationファイルの作成。今のディレクトリ直下にできます。
(mgr:create "create_users")
;; migrationを実行します。
(mgr:migrate! "full migration-file path")
;; rollbackも可能です。
(mgr:rollback! "full migration-file path")
migrationファイルの書き方
(in-package :cl-user)
(defpackage :3770156273_create_users
(:use :cl
:mgr))
(in-package :3770156273_create_users)
;; migrate!で実行されます。
(defup
(create-table "users")
(add-column "users" "name" "varchar(255)")
)
;; rollbackで実行されます。
(defdown
(drop-table "users")
)
現在使えるクエリ一覧
ひとまずメインで使うコマンドだけを
実装しているので、対応しているクエリコマンドは
以下になります。(少ない...)
(create-table "name")
(add-column "table" "name" "data-type")
(drop-table "name")
(drop-column "table" "name")
できていないこと(TODO)
- ほかのクエリにも対応する。
- データベースとの接続を毎回行うのは手間なので、設定ファイルを作って読み込む。
- schemaファイルを作成する。
- どのmigrationが実行されているのかわかるようにする。(up downの区別)
つまったこと・よくわからなかったこと
-
There is no applicable method for the generic function
のエラーの解決方法。mgr内で定義していたexecuteが他のpackageと衝突していた気がする。
できなかったこと
-
disconnect-dbがうまく機能していない。コネクションが確立されたまま。
-
defupマクロでup関数を定義しているのですが、
upがmgrパッケージ内で定義されてしまい、migrationのpackage(ex. 3770156273_create_users)内で定義することができなかった。個人的にはup関数を実行するときはmigrationのpackage内のup関数を使いたかった。 -
defupで簡単にクエリを記述できるようにしたが、
defupでup関数の定義、executeでup内のクエリを実行する流れはもっときれいにする方法がある気がする。