Play2のevolutionスクリプトのコメントを表示するプラグインを書いた

この記事は Play or Scala Advent Calendar 2012 12/8 分の記事です。

前は @lyrical_logical さんの View/Context Bounds の制約 です。
次は @gakuzzzz さんです。


Play2には「evolutions」という、DBスクリプトを管理してくれる機能があります。他の仕組みでDDL等を管理していないのであれば、これを利用しているのではないでしょうか。

スクリプトには、スキーマの変更情報をSQL直で記述できるので、RoRのmigrationよりもいいなーと思っているのですが、ファイル名が気になっていました。

migrationでは、ファイル名を201212080149_create_users_schema.rbのように自由に決めることができ、ファイル名からある程度どのようなスクリプトかが判断できます。

しかし、evolutionsでは、ファイル名が1.sql, 2.sqlというように固定となっており、ファイル名からスクリプトの中身を判断できません。

そのため、Playプラグイン(sbtプラグイン)の勉強をかねて、evolutionsスクリプトに記載されているコメントを一覧で表示するプラグインを書いてみました。

rabitarochan/play2-evolist-plugin

どんなもの?

playコンソールでevolistというコマンドを実行すると、スクリプトのコメント部分を列挙するプラグインです。

スクリプトには#で始めるとコメント行として認識されるため、スクリプトからその行を取得し、一覧として表示しています。

例として、以下のようなスクリプトがあったとします。

(1.sql)
# Person schema

# !Ups
create sequence person_id_seq;
create table person (
  id integer not null default nextval('person_id_seq'),
  name varchar(40)
);

# !Downs
drop table person;
drop sequence person_id_seq;
(2.sql)
# Group schema with add column to User schema

# !Ups
create sequence group_id_seq;
create table group (
  id integer not null default nextval('group_id_seq'),
  name varchar(40)
);
alter table user add column group_id integer;

# !Downs
alter table user drop column group_id;
drop table person;
drop sequence person_id_seq;

この場合、スクリプトを実行すると以下のような出力が得られます。

[testapp] $ evolist
database: default
1: Person schema
2: Group schema with add column to User schema

もしコメントが長い場合、次の行に行った場合に適切なインデントを入れてあげるようにしています。( 現在はコンソールが 80 文字と決め打ちをしています。この部分はちゃんと実装します・・ )

[testapp] $ evolist
database: default
1: Person schema
2: Group schema with add column to User schema
3: This script is fix to the user join to some groups. Define relation table for
    user and group.

あ、一文字ズレてる!!

また、以下のようにDB名を指定することもできます。

[testapp] $ evolist -db test
database: test
...

まとめ

なにもまとまりませんが・・・。

ネタを探しつつ、ふと前から不便に思っていた部分を実装してみました。実装を初めてまだ時間が経ってなく、絶賛実装中です。ドキュメントもテストも整備されていません。

evolutionスクリプトを使ってらっしゃる方で同じようなことを思っていた方は、一度試していただき、いろいろとツッコミを入れていただければと思います。

sbtプラグインについても少しずつ分かってきたので、ネタが見つかったらプラグインの作り方を書こうと思います。

evolutionsスクリプト、ファイル名じゃ何がなんだか分からないからプラグインを書いてみたよー。というお話でした。