Grails > Grails ORM (GROM) : データアクセス編

更新日 2014-12-06
広告

GrailsはHibernateを内包しているため、簡単な設定でデータベース(RDBMS)処理を行うことができます。この機能のことを、GORM (Grails Object Relational Mapping)と呼びます。以下の説明は Grails 2.x 前提です。また、こちらの記事で説明した MyappRecord というドメインクラスを想定しています。

データの保存

作成したドメインクラスを、テーブルに保存します。テスト用のプログラムは、GroovyConsoleを使って実行してみます。
$ grails console

(別に、上記のように'grails console'で起動することは必須ではありません。しかし、上記以外の方法でテストする場合は、自分でHibernateなどのライブラリ群にパスを通す必要があります。)

GroovyConsoleに、「MyappRecordをテーブルに追加するプログラム」を書いて実行します。

def p = new myapp.MyappRecord(id: 1, date: new Date(), money: 100)
p.save()
これで、MyappRecordがテーブルに追加されるはずです。
mysql> select * from myapp_record;
+----+---------+---------------------+-------+
| id | version | date                | money |
+----+---------+---------------------+-------+
|  1 |       0 | 2012-08-26 00:29:08 |   100 |
+----+---------+---------------------+-------+
1 row in set (0.05 sec)
saveメソッドを実行したのに、データが追加されない場合は、以下のようにしてみましょう。
p.save(flush: true)
こうすると、Grailsがクエリをバッファリングすることなく、すぐに実行します。常にバッファリングを無効にしたい場合は、Config.groovyに以下を追加するとよいでしょう。
grails.gorm.autoFlush=true
また、GrailsがどのようなSQLクエリをデータベースに発行しているかを調べたい場合は、DataSource.groovyに以下のパラメータを追加しましょう。SQLクエリを標準出力します。
dataSource {
  logSql = true
  formatSql = true
   :

データの取得

次に、idを指定して、MyappRecordを取得します。
def r = myapp.MyappRecord.get(1)
// 以下、取得したデータを表示
println r.id // -> 1
println r.money // -> 100

このように、非常に簡単に読み書き処理が行えることがわかります。

テーブルの全レコードを取得するには、以下のようにします。

    def list = MyappRecord.list()
dateカラムで逆順ソートして、20レコードだけ取得する場合は、以下のようにします。
    def list = MyappRecord.list(sort: "date", order: "desc", max: 20)
dateカラムに、範囲指定の条件を指定して、条件に合うレコード群を取得する場合は、以下のようにします。
    def list = MyappRecord.findAllByDateBetween(startDate, finishDate)
これにソート処理を組み合わせることも可能です。
    def list = MyappRecord.findAllByDateBetween(startDate, finishDate, [sort: "date", order: "desc"])
Grailsは、ドメインクラスのプロパティ名に応じて、上記のような条件指定メソッドを自動生成します。MyappRecordは'date'や'money'というプロパティ名を持つため、上記のようなメソッド名となります。例えば、dateカラムの範囲指定に、moneyカラムも条件に加えたい場合、以下のようなメソッドを使えます。
    def list = MyappRecord.findAllByDateBetweenAndMoney(startDate, finishDate, 105)
複数のカラムでソートしたい場合はCriteriaを使います。 以下は、dateカラムとmoneyカラムでソートする例です。
    def c = MyappRecord.createCriteria()
    def records = c {
      order("date", "desc")
      order("money", "asc")
      maxResults(256)
    }

データの削除

データを削除したい場合は、以下のように、データベースからデータを取得し、deleteメソッドを実行すればよいです。
  def r = MyappRecord.get(1)
  r.delete()
あるテーブルのデータをまとめて削除したい場合は、以下のように、deleteAllメソッドを使うとよいです。
    def query = MyappRecord.where {
      id > 0 // 全レコードマッチするような条件を指定
    }
    int num = query.deleteAll()

constraints nullable

ドメインクラスのプロパティが「nullでもOKか」は、constraintsの'nullable'で指定できます。

バージョン2.3の後半から、デフォルトで「nullが禁止」になりました。 つまり、ドメインクラスのプロパティに1つでもnullがある状態で、saveメソッドを実行するとエラーになります。

アプリケーションによっては、このふるまいが面倒になることもあると思います。 デフォルトで「nullでもOK」にするには、conf/Config.groovyに、以下の設定を追加します。

grails.gorm.default.constraints = {
    '*' (nullable: true)
}
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system