読者です 読者をやめる 読者になる 読者になる
おもに Groovy やアジャイル開発について勉強していることを書き散らしてます。
わたしのひとりごとが、だれかのお役に立てればと…

Grails ドメインクラスを作ると、DBテーブルが勝手にできあがる

 
Grails をお勉強中です。
Grails 徹底入門』や Grails 日本語ドキュメント(http://grails.jp/doc/2.0.x/)を見ながら試行錯誤しています。

Grails 徹底入門』は2008年に出版されたもので、Grails 1.0.3 がベースとなっています。現時点での current の Grails 2.0.x とは違っている部分があると感じています。
たとえば、『Grails 徹底入門』の画面遷移で使っている Web Flow は 2.0.x では使っていないように見えます。
詳しくはまだ理解しきれていないので断定はできませんが、進歩している機能は使っていきたいので、調べながら実装しています。

まだ1画面も作りきれていませんが、触っていくなかで驚いたことを今回はあげます。

・ドメインクラスを作ると、勝手に CREATE TABLE される
・DBが組み込まれている
・run-app したら、色々と良きに計らってくれる
・DB の CRUD 処理の実装が恐ろしく簡単

ドメインクラスを作ると、勝手に CREATE TABLE される

> grails create-app sampleApp

まずは create-app でアプリケーションを作成します。

> grails create-domain-class Sample

Sample というドメインクラスを作ります。ドメインクラスはエンティティ、DBテーブルにあたるものです。

class Sample {

    String sampleId
    String sampleName
    Date sampleDate
    
    static constraints = {
        sampleId (maxSize: 2)
    }
}

Sample ドメインクラスの中身を実装しました。3つのプロパティを持っています。
constraints で、各プロパティの制約(必須、サイズ、一意制約など)を実装します。

run-app すると、色々とよきに計らってくれる

> grails run-app

ということで、アプリケーションを起動します。アプリケーションサーバが組み込まれているので、Tomcat の準備とか不要です。
まだ、コントローラを作っていないので画面にアクセスはできません。

ですが、ドメインクラスは作ってあるので、それに対応したDBテーブルが作成されます。つまり、自動的に DB に対して CREATE TABLE 文が発行されています。

DBが組み込まれている

Grails には、H2 という DB が組み込まれています。run-app でアプリケーションを起動すると、H2 データベースも起動します。
http://localhost:8080/sampleApp/dbconsole」の URL でH2 のコンソールにアクセスできます。

スクリーンショット 2012-12-02 21.20.44

コンソールにアクセスして、DB の中身を見てみると SAMPLE テーブルが作成されていることがわかります。
各カラムのサイズや NOT NULL などはドメインクラスの constraints の設定が反映されるようです。

スクリーンショット 2012-12-02 21.20.33

テーブルの CRUD 処理の実装が恐ろしく簡単

次に、コントローラを作ります。

> grails create-controller Sample

SampleController クラスが作成されます。index という空っぽのアクションが用意されます。
とりあえず、DB アクセスがしたいので Sample インスタンスを作って save() を呼び出してレコード追加します。

class SampleController {

    def index() {
        new Sample(sampleId: "01", sampleName: "abc", sampleDate: new Date()).save()
    }
}

MVCトランザクション制御を考えると、Service を作るべきですが…とりあえずです。
ビューを指定していないので、grails-app/views/sample/index.gsp をビューとして使用し遷移します。

index.gsp ファイルが存在せず、このままだとアクセスするとエラーになるので、ファイル新規作成します。

<html>
<head>
<title>index ページ </title>
     <meta name="layout" content="main" />
</head>
<body>
     Hello World.
</body>
</html>

動的な画面にしたいですが、DB アクセスを実感できればいいので…こんな感じで。

> grails run-app

http://localhost:8080/sampleApp/sample/index」にアクセスすると、コントローラが実行されて画面表示されます。
この状態で先ほど見たDBコンソールで SAMPLE テーブルを検索していみると、レコードが1件追加されているのがわかります。

スクリーンショット 2012-12-02 21.42.53

勝手にやってくれることをまとめ

DB が組み込まれていて勝手に動き出す、そして接続もできてしまう。
ドメインクラス作ったら勝手に CREATE TABLE されている。

DB(OracleMySQL)をインストールして、インスタンス作る。そして、CREATE TABLE の DDL を作って発行する。
毎回やることですが、結構手間ひまかかります。
しかし、ここまでやってしまわないと、動くアプリケーションにはなりません。

そこを一足飛びにやってしまう Grails はすごいなあと感心してしまいました。
わかっている人からすると、当然なんだろうと思いますが。

でも、この辺の当たり前のことは rails に触れたことのない人にとっては天変地異的なことです。
逆に Grails の入門的なサイトをいくつか見ましたが、詳細に書かれていないように感じました。

「DB 用意しなくていい」「勝手にテーブルが作られる」といった、うたい文句が明記されているといいと思います。

Grails わかってくると楽しいですね。最初はちんぷんかんぷんでしたが。