2

目標 - 1 回の展開/再起動で、新しいテーブルを作成し、いくつかのレコードを入力したいと考えています。これは、このデータがそこにあることを期待するコードの変更があるためです。

理想は、これを実現する移行を作成することです。クラスを作成し、 でテーブルをFoo作成する移行を生成し、 で移行を実行したとします。これで、ドメイン クラスとデータベース テーブルの両方ができました。涼しい。foograils dbm-gorm-diff ....grails dbm-update

ここで、テーブルにデータを入力する新しい移行を作成します。

databaseChangeLog = {
    changeSet(author: "samslotsky", id: "PopulateFooTable") {
        grailsChange {
            change {
                new Foo(bar: 'baz').save()
                new Foo(bar: 'blitz').save()
            }
        }
    }
}

それを changelog.groovy に追加します

include file: 'populate-foo-table.groovy'

再度実行した後、テーブルgrails dbm-updateにレコードがありません。アプリケーション コードから問題なくオブジェクトfooを作成できるため、これは検証の問題ではありません。Foo移行内でブレークポイントがキャッチされないように見えるため、移行が実行されたかどうかを確認する方法さえわかりません。

したがって、次の 2 つの質問をするのがよいと思います。

  1. 副次的な影響 (つまり、db テーブルに値が入力される) を探す以外に、移行が実行されたことを確認するにはどうすればよいですか?
  2. 移行から新しいレコードを作成するにはどうすればよいですか? Groovy コードを使用できますか? それとも SQL の記述に行き詰まっていますか?

最初にテーブルとドメイン クラスを作成して展開し、インポート ツールまたは管理インターフェイスを作成してデータをシードし、コードを変更してデータを使用できることに気付きました。私は本当にそのすべてを経験したくありません。これは、Rails の場合と同様に、1 回のデプロイでシームレスに実行できるはずです。

ありがとう!

4

2 に答える 2

6

私の知る限り、あなたの質問に対する答えは次のとおりです。

ドキュメントに従って、Groovy コードを実行でき、SQL ステートメントを実行するために groovy.sql.SQL のインスタンスが挿入されます。次のようなことをしたいでしょう:

 databaseChangeLog = {
        changeSet(author: "samslotsky", id: "PopulateFooTable") {
            grailsChange {
                change {
                    sql.execute("insert into foo (bar) values ('baz')")
                    sql.execute("insert into foo (bar) values ('blitz')")
                }
            }
        }
    }

DATABASECHANGELOG テーブルを調べて、特定の変更セットが実行されたかどうかを判断できます。これを HTML 経由で表示できるコントローラーもあります。

于 2013-05-24T19:06:41.433 に答える