2016-08-31 9 views
0

アプリケーションをgrails 3.1.9に更新しました。データベース移行プラグインに問題があります。grails 3データベース移行

マイ生産application.ymlは、次のようになります。

buildscript { 
dependencies { 
     classpath 'org.grails.plugins:database-migration:2.0.0.RC4' 
    } 
} 

    dependencies { 
     compile 'org.liquibase:liquibase-core:3.4.1' 
     compile 'org.grails.plugins:database-migration:2.0.0.RC4' 
    } 

これは、変更履歴の始まりです:

databaseChangeLog = { 

    changeSet(author: "michal (generated)", id: "1472650791344-1") { 
     createTable(tableName: "appointment") { 
      column(autoIncrement: "true", name: "id", type: "BIGINT") { 
       constraints(primaryKey: "true", primaryKeyName: "appointmentPK") 
      } 

      column(name: "version", type: "BIGINT") 

      column(name: "customer_id", type: "BIGINT") 

      column(name: "duration", type: "BLOB(255)") 

      column(name: "note", type: "CLOB") 

      column(defaultValueComputed: "0", name: "personal_available", type: "BOOLEAN") 

      column(defaultValueComputed: "0", name: "personal_booked", type: "BOOLEAN") 

      column(name: "provider_id", type: "BIGINT") 

      column(name: "start_time", type: "BLOB(255)") 

      column(name: "url", type: "VARCHAR(255)") 
     } 
    } 

production: 
     dataSource: 
       driverClassName: org.postgresql.Driver 
       dialect: org.hibernate.dialect.PostgreSQLDialect 
       dbCreate: none 
       url: jdbc:postgresql://localhost:5432/something 
       username: postgres 
       password: postgres 
       properties: 

私のbuild.gradleは、このようになります私は生産モードで私のアプリを実行すると、私はこのエラーが発生します。

SEVERE 8/31/16 3:41 PM: liquibase: changelog.groovy: changelog.groovy::1472650791344-1::michal (generated): Change Set changelog.groovy::1472650791344-1::michal (generated) failed. Error: ERROR: relation "appointment" already exists [Failed SQL: CREATE TABLE public.appointment (id BIGSERIAL NOT NULL, version BIGINT, customer_id BIGINT, duration BYTEA, note TEXT, personal_available BOOLEAN DEFAULT 0, personal_booked BOOLEAN DEFAULT 0, provider_id BIGINT, start_time BYTEA, url VARCHAR(255), CONSTRAINT "appointmentPK" PRIMARY KEY (id))] 
liquibase.exception.DatabaseException: ERROR: relation "appointment" already exists [Failed SQL: CREATE TABLE public.appointment (id BIGSERIAL NOT NULL, version BIGINT, customer_id BIGINT, duration BYTEA, note TEXT, personal_available BOOLEAN DEFAULT 0, personal_booked BOOLEAN DEFAULT 0, provider_id BIGINT, start_time BYTEA, url VARCHAR(255), CONSTRAINT "appointmentPK" PRIMARY KEY (id))] 
    at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:316) 

...

Caused by: org.postgresql.util.PSQLException: ERROR: relation "appointment" already exists 

それは動作しませんなぜ私は、任意のアイデアを高く評価することでしょう。


ありがとうグレゴール・ペキン。検証するためにdbcreateを設定すると、このエラーを修正するのに役立ちました。

+0

明示的に 'dbCreate'を' none'ではなく 'validate'に設定すると助けになりますか? –

+0

@Gregor Petrinこんにちは助けてくれたようです。私の編集を参照してください。 –

答えて

2

問題は、あなたのdbCreate句と無効dbCreate値が無視される原因となった行動の非常に不便な変化です。 Hibernateがデータベースを混乱させ、データベースの移行を妨げたくない場合は、dbCreate: validateを使用してください。

プラグインはGrailsアプリケーションに値を提供することができます。そのため、プラグインを1つずつ実行してから最後にapplication.ymlに設定した内容を上書きすることができます。開発とテストを簡単にするために、プラグインは独立型のGrailsアプリケーションであるため、多くのプラグインはdbCreateとなります。

起こっ不便な変更が値をオーバーライドすると、コンフィギュレーションに貢献する機会があったのは最新の、ランダムに選択されたプラグインが残した前に今すぐ無効dbCreateオプションは、そのプラグインがASかもしれません(無視されますということでした開発環境でさえも非常に不便なcreate-dropを使用してください。実際、新しいGrailsバージョンでは、現在の動作が非常に危険なので、プラグインの設定は無視されます。

データベースの移行が実行されると、すでにテーブルを作成するためにupdateまたはcreate-dropの設定が使用されていたため、データベースの移行は失敗します。値をvalidateに設定すると、プラグインが設定したものを上書きするための有効な置き換えが提供されます。

1

テーブルがすでに存在しているとは思えますが、昨夜はdev環境でこのようなことが発生しました。たとえば、dbCreate: noneがあっても、バグのためにhbm2ddl移行ツールが実行された可能性があります。ログを確認します。

databasechangelogテーブルが何らかの理由で誤って消去された可能性があります。 databasechangelogテーブルに、その特定のチェンジセットに対応する行があるかどうかを確認します。あなたは、この特定のチェンジのために何ができる

ことの一つは、チェンジセットにtableExists事前条件を追加し、テーブルが既に存在する場合EXECUTEDとしてチェンジをマークするonFail="MARK_RAN"を使用しています。 Liquibaseの著者は、パフォーマンス問題のために事前条件を控えめに使用する必要があると書いていました。したがって、各チェンジセットの事前条件を作成し直したいと思った場合は、再検討してください。そのノートオン

、あなたがより多くのチェンジのためにこのエラーが発生した場合は、基本的にサーバーの以降の再起動でそれらのチェンジの際にそれらを無視するLiquiBaseをを言って、「実行」として、すべてのチェンジセットをマークするdbm-changelog-synchttp://grails-plugins.github.io/grails-database-migration/1.4.0/ref/Maintenance%20Scripts/dbm-changelog-sync.html)を使用する必要があります。

実際に実行したい(無視しない)チェンジセットがいくつかある場合(たとえば、最近変更を加えた場合など)、コンテキストを使用して「無視する」チェンジセットにタグを付けることができますこれらの値をcontext引数としてdbm-changelog-syncコマンドを実行します。

詳細については、次のリンクを参照してください。 * http://grails-plugins.github.io/grails-database-migration/1.4.0/ref/Maintenance%20Scripts/dbm-changelog-sync.html * http://www.liquibase.org/2014/11/contexts-vs-labels.html

関連する問題