升级到grails 3后{gra}数据库迁移插件问题

时间:2016-03-21 02:54:47

标签: spring grails migration liquibase

我使用的是先前版本的grails-database-migration插件已经有一段时间了,并且从来没有遇到过任何重大问题。但是,最近我将整个项目升级到grails 3.0.9并做了一些额外的开发,行为如下:

  1. 将当前prod数据库结构导入本地计算机(该数据库副本没有最新更改和新实体)

  2. 执行:grails -Dgrails.env=staging dbm-gorm-diff changlog.xml

  3. 此时我所期待的是新的changlog.xml文件,其中包含现有实体和新实体的所有更改。

    我得到了什么:

    • 新定义的实体自动添加到数据库中。
    • changlog.xml中的更改仅包括已存在的表的更改,例如: enter image description here

    另外,如果我尝试运行grails -Dgrails.env=staging run-app

      

    错误grails.boot.GrailsApp - 应用程序启动失败   org.springframework.beans.factory.BeanCreationException:创建名为'springLiquibase_dataSource'的bean时出错:init方法的调用失败;嵌套异常是java.lang.NoSuchMethodError:liquibase.integration.spring.SpringLiquibase.createDatabase(Ljava / sql / Connection; Lliquibase / resource / ResourceAccessor;)Lliquibase / database / Database;   FAILURE:构建因异常而失败。

         
        
    • 出了什么问题:任务执行失败':bootRun'。   进程'命令'/ Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/bin/java''   完成非零退出值1   ...
    •   
         

    ...

         
        
    • 尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。 |错误无法启动服务器(使用--stacktrace查看完整跟踪)
    •   

    以下是我的application.yml

    部分
    dataSource:
        pooled: true
        url: jdbc:mysql://127.0.0.1:3306/triz?useUnicode=yes&characterEncoding=UTF-8
        driverClassName: "com.mysql.jdbc.Driver"
        jmxExport: true
        username: root
        password: password
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
        properties:
            jmxEnabled: true
            initialSize: 5
            maxActive: 50
            minIdle: 5
            maxIdle: 25
            maxWait: 10000
            maxAge: 600000
            timeBetweenEvictionRunsMillis: 5000
            minEvictableIdleTimeMillis: 60000
            validationQuery: SELECT 1
            validationQueryTimeout: 3
            validationInterval: 15000
            testOnBorrow: true
            testWhileIdle: true
            testOnReturn: false
            jdbcInterceptors: ConnectionState
            defaultTransactionIsolation: 2
    
    environments:
        development:
            dataSource:
                dbCreate: create
    #            url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
        test:
            dataSource:
                dbCreate: update
                url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
        staging:
            dataSource:
                url: jdbc:mysql://127.0.0.1:3306/triz_staging?useUnicode=yes&characterEncoding=UTF-8
    

    和gradle.build

    buildscript {
        ext {
            grailsVersion = project.grailsVersion
        }
        repositories {
            mavenCentral()
            mavenLocal()
            maven { url "https://repo.grails.org/grails/core" }
        }
        dependencies {
            classpath "org.grails:grails-gradle-plugin:$grailsVersion"
            classpath 'com.bertramlabs.plugins:asset-pipeline-gradle:2.5.0'
    //        classpath 'com.bertramlabs.plugins:less-asset-pipeline:2.6.7'
            classpath "org.grails.plugins:hibernate:4.3.10.5"
            classpath 'org.grails.plugins:database-migration:2.0.0.RC4'
        }
    }
    ...
    ...
    dependencies {
     ...
        compile 'org.liquibase:liquibase-core:3.3.2'
        runtime 'org.grails.plugins:database-migration:2.0.0.RC4'
    }
    

    更新 我有另一种方法来解决这个问题: 我的计划是根据我当前的prod DB生成更改日志,然后为我所做的更改生成差异。听起来简单明了;然而,它并没有像预期的那样成功。这是我做的:

    1. Dumped prod DB
    2. 删除了liquibase表
    3. 运行:grails dbm-generate-changelog changelog-init.xml --add 此时,我希望changelog-init.xml包含DB的当前状态。但是,它首先根据我的模型应用更改,然后尝试生成差异。最后,我最终得到了一个包含我整个现有数据库的更改日志,其中包含了从gorm应用的更改。
    4. 我在这里做错了什么?

      其他观察

      看起来,每当我尝试运行任何与迁移相关的命令时,grails会在此之前应用所有更改,即使通过我的配置说:

      staging:
              dataSource:
                  dbCreate: ~
                  url: jdbc:mysql://127.0.0.1:3306/triz_staging?useUnicode=yes&characterEncoding=UTF-8
                  properties:
                      jmxEnabled: true
      

      还尝试完全删除dbCreate。什么都没改变...... 我完成了,不知道下次去哪儿!!!

1 个答案:

答案 0 :(得分:0)

嗯,这是一笔交易...... 我不确定这是不是真的原因,但我所做的就是将数据源配置从application.yml移到application.groovy,一切都恢复正常。

我很乐意听到你的想法。

感谢。