0

移行プラグインを使用してフィールドを追加しています:

databaseChangeLog = {
    changeSet(author: "me", id: "add publish_date") {
        addColumn(tableName: "book") {
            column(name: "publish_date", type: "timestamp") {
                constraints(nullable: "true")
            }
        }
    }
}

publish_dateまた、いくつかの更新をしたいと思いBookます。それを行う1つの方法は、を使用することですsql.execute("UPDATE book SET publish_date = ____ WHERE year = 2012")が、これはデータベースにとらわれないようには見えません...そして私はそれを望んでいます。

Book移行でドメインを使用すると、さまざまなデータベースで移行が確実に機能するようになると思います。これが正気/可能であるかどうか誰かがコメントできますか?

changeSet(author: "me", id: "add publish_date") {
    grailsChange {
        change {
            Book.findAllByYear(2012).each { book ->
                book.publishDate = _____
                book.save()
            }
        }
    }
}

移行データベースにとらわれないようにしたい場合のオプションは何ですか?

4

1 に答える 1

1

Liquibase+プラグインでそれを行う方法は

update(tableName: 'book') {
   column name: 'publish_date', value: '____'
   where 'year = 2012'
}

これは、データベースごとに異なる可能性があるため、生のSQLアプローチと同様の問題がありますが、LiquibaseにはHibernateのHQLのようなものはありません。変更セットを特定のデータベースにのみ適用するように制限できるため、使用するデータベースごとに変更セットを作成でき(たとえば、devとは異なるタイプのprod)、正しいデータベースのみが実行されます。

GORMの問題は、スクリプトがGroovyクラスであり、異なるバージョンのコードでコンパイルされないことです。そのため、誰かが遅れたり、新しい開発者がすべての移行を実行してデータベースを構築したりすると、コンパイルエラーで失敗します。 。

したがって、どちらのアプローチが最も悪いかを選択する必要があります。

于 2012-12-12T00:39:44.927 に答える