豆無日記スマートフォン用の表示で見る豆無日記この広告は、90日以上更新していないブログに表示しています。Mapping)というDSL記法を使って記述します。基本的に1つのドメインモデルは、1つのテーブルに対応します。ドメインモデルは、エンティティと呼んでもかまいません。ここでは同じモノを指します。●GORMを元にしたDBスキーマの自動生成Grailsでは$APP_HOME/grails-app/conf/DataSource.groovyファイルに、接続先のDataSourceを定義します。GORMでドメインモデルを定義しておき、Grailsをそのまま起動すると、なんと対象DataSourceに対して自動的にGORMの定義情報を元に決定されたDDLが発行されて、DBスキーマが生成されます。開発初期には結構便利です。DBスキーマを勝手にいじって欲しくない場合は、DataSource.groovyの中に書いてあるdbCreateという設定エントリをコメントアウトまたは削除すればOKです。Grails起動時にDBスキーマを生成し、Grails停止時に破棄する。Grails起動時にDBスキーマを生成する。現在のスキーマとGORMの定義に差分があってもスキーマを更新しない(※1)。Grails起動時に存在しなければDBスキーマを生成する。現在のスキーマとGORMの定義に差分がある場合はスキーマをアップデートする(※2)。GrailsからはDBスキーマを一切変更しない。いいつつ、Grails1.1.1で確認するとスキーマ変更もされてるっぽい。『Grails停止時にDROPはせずに、次回の起動時にDROP&CREATEをする』という挙動を示している。NULL制約は追加されない。既存レコードに対するカラム時は、そのカラムの値がNULLとなる。●Grailsと"環境"Grailsでは、起動するときに「開発(development)」「テスト(test)」「本番運用(production)」の3つの環境を選択できます。開発とテストではHsqldbを使うけど、本番はPostgreSQLで、みたいな設定もできます。毎回設定ファイルを書き換えるのではなく、3種類の設定を書いておいて、実行時に選択することになります。起動時に、環境を指定する場合は以下のようにします。使う前項のdbCreateですが、本番用のproductionではコメントアウトまたは削除をしておくことをお勧めします。GORMを書き換えて再起動したら、DB上の本番データが消えてました!という大惨事が起こらないようにご注意ください。●GORMにおけるプライマリキーとしてのidカラムさて、GORMを使った場合、自分で宣言しなくても、プライマリキー(以下、PK)として自動的にidカラムが生成されます。(ちなみに楽観的排他制御のためにversionカラムも作られますが、とりあえずそれはおいておきます。)GORMの仕様としては複合主キーも指定可能っぽいです。じつはこれは試したことがありませんのでよくわかりません。DBアーキテクトな方には怒られてしまうかもしれませんが、PKは専用の通番カラムであるidにしておいて、他の制約は別途ユニーク制約などでつければよい、と思っています。どちらにせよGrailsを使う場合は、素直にidカラムを受け入れましょう。●idの通番管理idカラムはPKなので、ユニークな値にしなければなりません。GrailsではデフォルトでHibernateの通番管理の仕組みを利用します。Hibernateのデフォルトの通番管理方式では、RDBMSがシーケンスに対応している場合、RDBMS上にhibernate_sequenceというBIGINTなシーケンスを生成して、以降ではそれを使って通番を払い出します。注意事項として、デフォルトではこのシーケンスはRDBMS上に一つだけしかありませんので、Hibernateにまかせると、複数のテーブルをまたいで通番が払い出されまくることになります。9}実際にこれで運用すると精神衛生上あまりよろしくないと思います。テーブルごとに1:1で個別のシーケンスを生成して、それで通番管理させることをお勧めします。Grailsに「このドメインモデルのテーブルはこのシーケンスを使ってね」と指定するには以下の様にドメインモデルに書けばOKです。}}●PostgreSQLのserialとシーケンス唐突ですが、PostgreSQLにはserial型という特別なデータ型があります。SERIAL);は以下を指定することと同じです。tablename.colname;これ、非常に便利です。"_seq"となります。INSERTでidを省略したときに自動的にシーケンスから自動補填してくれるようにデフォルト設定まで自動生成してくれます。テーブル名"というコマンドを実行すると、どのようなスキーマになったのかが表示されます。確認しておきましょう。(biginteger相当。8byte)を使いましょう。●GrailsでPostgreSQLのシーケンスを使うというわけで、GrailsでPostgreSQLのシーケンスを使う方法ですが、簡単には以下の様になります。対象ドメインモデルのmappingとして以下のid設定を追加する。(id)●まとめというわけで実験の結果、Grailsが素敵にシーケンスを生成してくれることがわかります。serialの様に、INSERTでidを省略したときに自動的にシーケンスから自動補填してくれるデフォルト設定まではさすがに生成してくれません。SQL操作をすることも視野に入れれば、DBスキーマはid=serial型でCREATE文を直接発行して生成しておき、GrailsではdbCreateをコメントアウトして勝手にスキーマをいじらないようにしつつ、GORMのmappingでserialが生成するシーケンスを指定する、というのが無難なところかと思います。SQLでINSERTなんて実行しないし、もし実行するとしてもcurrvar関数などをつかって自力でシーケンスを使いこなすから、普段はGrailsに全部お任せしたいのさ!という向きには、dbCreate=createDropまたはupdateをお勧めしておきます。あ、もちろん運用開始にはdbCreateは削除してくださいね。千秋楽はMariottホテルで月別アーカイブはてなブログをはじめよう!nobeansさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。