2015-07-16 2 views
1

Я попытался запустить сценарий «dbm-db-doc». Похоже, что скрипт работает неправильно, потому что он не сработал с измененным списком изменений, который уже был выполнен. Это изменение:Ошибка сценария db-doc-dc-миграции Grails

changeSet(author: "Bernardo (generated)", id: "1436991688243-1") { 
    addColumn(tableName: "prepares_for_exam") { 
     column(name: "exam_id", type: "bigint") 
    } 

    grailsChange { 
     change { 
      sql.execute("UPDATE prepares_for_exam JOIN product ON prepares_for_exam.id = product.prepares_for_exam_id SET prepares_for_exam.exam_id = product.id") 
     } 
     rollback { 
     } 
    } 

    addNotNullConstraint(columnDataType: "bigint", tableName: "prepares_for_exam", columnName: "exam_id") 
} 

changeSet(author: "Bernardo (generated)", id: "1436991688243-32") { 
    dropColumn(columnName: "prepares_for_exam_id", tableName: "product") 
} 

И в базе данных, этот список изменений был отмечен как «ВЫПОЛНЕНО» changelog has been executed

Но при запуске сценария, кажется, что скрипт хочет выполнить этот список изменений и не потому, что столбец «product.prepares_for_exam_id» уже удален.

Полная ошибка:

|Starting dbm-db-doc for database root @ jdbc:mysql://localhost:3306/xxx?autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'product.prepares_for_exam_id' in 'on clause' 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2828) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2777) 
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:949) 
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:795) 
    at Script1$_run_closure1_closure2_closure35_closure36.doCall(Script1.groovy:10) 
    at grails.plugin.databasemigration.GrailsChange.generateStatements(GrailsChange.groovy:159) 
    at liquibase.change.AbstractChange.getAffectedDatabaseObjects(AbstractChange.java:208) 
    at liquibase.changelog.visitor.DBDocVisitor.visit(DBDocVisitor.java:95) 
    at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:58) 
    at liquibase.Liquibase.generateDocumentation(Liquibase.java:740) 
    at DbmDbDoc$_run_closure1_closure2.doCall(DbmDbDoc:27) 
    at _DatabaseMigrationCommon_groovy$_run_closure2_closure11.doCall(_DatabaseMigrationCommon_groovy:59) 
    at grails.plugin.databasemigration.MigrationUtils.executeInSession(MigrationUtils.groovy:133) 
    at _DatabaseMigrationCommon_groovy$_run_closure2.doCall(_DatabaseMigrationCommon_groovy:51) 
    at DbmDbDoc$_run_closure1.doCall(DbmDbDoc:26) 
    at org.grails.ide.api.impl.GrailsConnectorImpl.executeCommand(GrailsConnectorImpl.java:160) 
    at org.grails.ide.eclipse.longrunning.process.GrailsProcess.run(GrailsProcess.java:130) 
    at org.grails.ide.eclipse.longrunning.process.GrailsProcess.main(GrailsProcess.java:93) 
Error | 
org.codehaus.groovy.grails.cli.ScriptExitException 
Error | 

Так что мой вопрос:

Есть ли ошибка в «дБмВт-DB-док» -script или я что-то перепутались с ревизией?

ответ

2

я отвечаю на свой вопрос, потому что я нашел гуманного:

Это кажется, что миграция плагин сохраняет выполнения «grailsChange» часть каждый раз, хотя ревизия была выполнена уже (я понятия не имею, почему .. ответы приветствуются!)

Решение состоит в том, чтобы не использовать «grailsChange» и вместо этого использовать обычную команду «sql». Это разрешение:

changeSet(author: "Bernardo (generated)", id: "1436991688243-1") { 
     addColumn(tableName: "prepares_for_exam") { 
      column(name: "exam_id", type: "bigint") 
     } 

     sql(""" UPDATE prepares_for_exam JOIN product ON prepares_for_exam.id = product.prepares_for_exam_id SET prepares_for_exam.exam_id = product.id """) 

     addNotNullConstraint(columnDataType: "bigint", tableName: "prepares_for_exam", columnName: "exam_id") 
    } 
Смежные вопросы