3

このチュートリアルに従うのに苦労しています。私が取った手順は次のとおりです。

1.)最初に空の変更ログを作成します。このコマンドを実行する前に、開発dbCreateをに設定しましたcreate

grails dbm-create-changelog

2.)次に、最初の gorm 変更ログを生成します。チュートリアルでは、prodフラグを使用する必要があると書かれていますが、本番データベースが空であるため、prodフラグを削除します。dbCreateこのコマンドを実行する前に、開発設定をコメントアウトします。

grails dbm-generate-gorm-changelog --add changelog-1.0.groovy

この時点で、私のmigrationsフォルダーにはファイルchangelog.groovychangelog-1.0.groovy. と呼びchangelog-1.0.groovyますchangelog #1

3.)作成したばかりの変更ログで本番データベースを初期化しようとします。リンク先のチュートリアルに示されているように、データベースの移行updateOnStartと設定を設定しました。updateOnStartFileNames本番データベースは存在しますが、空です (テーブルがありません)。私の本番環境のdbCreate設定はコメントアウトされています。

grails prod run-app

問題:

一見、これは機能しているように見えますが、実行grails prod dbm-gorm-diffして生成すると、changelog #2存在しないはずの変更が表示されます。また、本番データベースの現在の状態と比較すると、変更セットが正当であることもわかります。これは、本番データベースが で正しく初期化されなかったことを意味しますchangelog #1 何も変更していないので、変更はありません。走ったgrails prod dbm-gorm-diff直後に走っgrails prod run-appた。

には 5 つの変更セットがありchangelog #2ます。これらすべての変更セットがchangelog #1. changelog #2全部で最初の 4 つのチェンジセットにはunique: "true". unique: "true"これら 4 つの変更セットは、 に含まれる唯一の変更セットでもありますchangelog #1。5 番目の変更セットが存在する理由を説明するには、まだ途方に暮れています。Spring Security プラグインuser_roleで使用されるテーブル用ですが、特に目立ったものはありません。ここにある:changelog #2

databaseChangeLog = {

    changeSet(author: "typoknig (generated)", id: "1341970550063-1") {
        createIndex(indexName: "authority_unique_1341970549765", tableName: "role", unique: "true") { // This table is for the Spring Security plugin's "Role" domain class.
            column(name: "authority")
        }
    }

    changeSet(author: "typoknig (generated)", id: "1341970550063-2") {
        createIndex(indexName: "name_unique_1341970549772", tableName: "foo", unique: "true") { // This is just a table for one of my domain classes that happens to have a field with a unique constraint.
            column(name: "path")
        }
    }

    changeSet(author: "typoknig (generated)", id: "1341970550063-3") {
        createIndex(indexName: "name_unique_1341970549774", tableName: "bar", unique: "true") { // This is just a table for one of my domain classes that happens to have a field with a unique constraint.
            column(name: "name")
        }
    }

    changeSet(author: "typoknig (generated)", id: "1341970550063-4") {
        createIndex(indexName: "username_unique_1341970549777", tableName: "user", unique: "true") { // This table is for the Spring Security plugin's "User" domain class.
            column(name: "username")
        }
    }

    changeSet(author: "typoknig (generated)", id: "1341970550063-5") {
        createIndex(indexName: "FK143BF46A5FBC0B79", tableName: "user_role") { // This table is for the Spring Security plugin's "UserRole" domain class.
            column(name: "role_id")
        }
    }
}

本番データベースが正しく初期化されていることを確認するにはどうすればよいですか?

更新#1:

理由はわかりませんが、 ではcreateIndex動作しませんunique: "true"unique: "true"最初の 4 つの変更セットでは、問題の列が最初に で作成された場所に単純に移動しましたchangeset #1。これにより、5 番目の変更セットだけが残りchangelog #2ます。まだ変更セットに問題は見られないので、適用されない理由がわかりません。

更新#2:

createIndexへのすべての呼び出しを、個々の変更セットから、テーブル (インデックスが属する) が作成された対応する変更セットに 移動できることがわかりました。これですべての問題が解決したようです。 やむを得ない理由を誰かが提供できない限り、変更ログ生成ワークフローのこの部分を作成すると思います。たとえば、これらの変更セット:

changeSet(author: "typoknig (generated)", id: "1342037835503-31") {
    createTable(tableName: "user_role") {
        column(name: "role_id", type: "bigint") {
            constraints(nullable: "false")
        }

        column(name: "user_id", type: "bigint") {
            constraints(nullable: "false")
        }
    }
}

changeSet(author: "typoknig (generated)", id: "1342037835503-103") {
    createIndex(indexName: "FK143BF46A4E6CF59", tableName: "user_role") {
        column(name: "user_id")
    }
}

changeSet(author: "typoknig (generated)", id: "1342037835503-104") {
    createIndex(indexName: "FK143BF46A5FBC0B79", tableName: "user_role") {
        column(name: "role_id")
    }
}

この変更セットが来るでしょう:

changeSet(author: "typoknig (generated)", id: "1342037835503-31") {
    createTable(tableName: "user_role") {
        column(name: "role_id", type: "bigint") {
            constraints(nullable: "false")
        }

        column(name: "user_id", type: "bigint") {
            constraints(nullable: "false")
        }
    }
    createIndex(indexName: "FK143BF46A5FBC0B79", tableName: "user_role") {
        column(name: "role_id")
    }
    createIndex(indexName: "FK143BF46A4E6CF59", tableName: "user_role") {
        column(name: "user_id")
    }
}
4

1 に答える 1

0

変更セットは、ターゲット データベースに依存する場合があります。たとえば、grails.org サイトは MySQL で MyISAM テーブルを使用しており、以前の変更セットで定義されていたとしても、dbm-gorm-diff常にいくつかの変更セットを追加していました。createIndex

createIndex宣言をcreateTable変更セットに移動することでどのような違いが生じるか、私には本当にわかりません。そうすることで、すべての問題がどのように解決されたかを明確にできますか?

于 2012-09-10T15:04:28.483 に答える