このチュートリアルに従うのに苦労しています。私が取った手順は次のとおりです。
1.)最初に空の変更ログを作成します。このコマンドを実行する前に、開発dbCreate
をに設定しましたcreate
。
grails dbm-create-changelog
2.)次に、最初の gorm 変更ログを生成します。チュートリアルでは、prod
フラグを使用する必要があると書かれていますが、本番データベースが空であるため、prod
フラグを削除します。dbCreate
このコマンドを実行する前に、開発設定をコメントアウトします。
grails dbm-generate-gorm-changelog --add changelog-1.0.groovy
この時点で、私のmigrations
フォルダーにはファイルchangelog.groovy
とchangelog-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")
}
}