3

このサイトを参考にして、 Grails Database Migration Pluginに慣れようとしています。not null 制約を持つプロパティを追加しようとしたときに問題が発生しました。サイトに表示されているのと同じ方法でスクリプトをモデル化しました (列を追加し、既存のレコードの既定値を設定し、列に null 不可の制約を追加します)。

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "1340893788251-1") {
        addColumn(tableName: "game") {
            column(name: "genre", type: "varchar(255)")
        }

        grailsChange{
            change{
                sql.executeUpdate("UPDATE game SET genre = 'Other'")
            }
        }

        addNotNullConstraint(tableName: "game", columnName: "genre")
    }
}

データベースを更新しようとすると、黙って失敗します。そこで、問題を追跡するために、3 つの変更を 3 つの異なる groovy スクリプトに分割しました。

最初のファイル (列の追加) は正常に機能しました:

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "1340893788251-1") {
        addColumn(tableName: "game") {
            column(name: "genre", type: "varchar(255)")
        }
    }
}

2 番目のファイル (既存のレコードに既定値を割り当てる) は正常に機能しました。

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "defaultValue") {
        grailsChange{
            change{
                sql.executeUpdate("UPDATE game SET genre = 'Other'")
            }
        }
    }
}

3 番目のファイル (not null 制約の追加) はサイレントに失敗します。

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "notNull") {
        addNotNullConstraint(tableName: "game", columnName: "genre")
    }
}

ログ ファイルには、プラグインに関連するもののみが表示されます。


2012-06-28 10 : DATABASECHANGELOG
17 :11,694 [main] INFO liquibase - 変更ログ ロックの取得に成功main] INFO liquibase - DATABASECHANGELOG
2012-06-28 10:17:12,009 からの読み取り [main] INFO liquibase - 変更ログ ロックの解放に成功しました

databasechangelog テーブルを確認すると、スクリプトが実行されていないことがわかります。コンソールは私にこれを与えました:

| | データベース ルート @ jdbc:mysql://localhost/migration の dbm-update を開始しています

しかし、ありません

| | dbm-update の完了

成功した更新で見られるように。

注:私が参照として使用しているサイトはバージョン 1.0 を使用していることに注意することが重要かもしれません。私はバージョン 1.1 を使用しています。このプラグインのチュートリアルやサンプルを見つけるのに苦労しており、最新バージョン (1 か月前にリリース) の情報を見つけるのはさらに困難です。

not null 制約でどこが間違っているのか、誰でも特定できますか?

4

1 に答える 1

5

昼食時にこのことについて考えていて、なぜ明確なデバッグ手順を実行しなかったのか疑問に思いました。グルーヴィーなスクリプトの変更はゼロから行われました。列を追加する更新が機能しました。つまり、DB とドメイン オブジェクトの唯一の違いは、null 不可の制約でした。

class Game {
    String genre

    static constraints = {
        genre(nullable:  false, blank:  false)
    }
}

...grails dbm-gorm-diffでは、プラグインを実行して何が表示されるか見てみませんか?

結果は次のとおりです。

databaseChangeLog = {
    changeSet(author: "Ryan (generated)", id: "1340897310305-1") {
        addNotNullConstraint(columnDataType: "varchar(255)", columnName: "genre", tableName: "game")
    }
}

私が作成した変更スクリプトとプラグインが作成したスクリプトの唯一の違いは、
columnDataType: "varchar(255)" です。

私が作成したスクリプトにそれを追加し(他に何も悪いことをしていないことを確認するため)、ビンゴ、更新が機能しました。

于 2012-06-28T18:18:55.140 に答える