在Java中使用带有Derby Embedded的liquibase的异常 [英] Exception using liquibase from Java with Derby Embedded

查看:100
本文介绍了在Java中使用带有Derby Embedded的liquibase的异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用groovy脚本进行Liquibase迁移.

I'm making Liquibase migration using groovy script.

我有类似的代码

def migrate() {

    def changeLog = "com/cadence/mdv/ngv/db.changelog.xml"
    Sql db = Sql.newInstance(profile.dbUrl, profile.dbUser, profile.dbPassword, profile.dbDriver)


    Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(db.connection))


    def liquibase = new Liquibase(changeLog
            , new ClassLoaderResourceAccessor()
            , database
    )
    liquibase.update(null)

}

但是我收到异常消息,告知某些表不存在

But I receive exception, telling that some table does not exists

liquibase.exception.MigrationFailedException: Migration failed for change set com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-31::pavelber (generated):
 Reason: liquibase.exception.DatabaseException: Error executing SQL ALTER TABLE APP.ACTION_ATTRIBUTES ADD CONSTRAINT FKD1111B00C05F2ED6 FOREIGN KEY (RUN_ID) REFERENCES APP.RUNS (ID) ON UPDATE NO ACTION ON DELETE NO ACTION: 'ALTER TABLE' cannot be performed on 'APP.ACTION_ATTRIBUTES' because it does not exist.:
      Caused By: Error executing SQL ALTER TABLE APP.ACTION_ATTRIBUTES ADD CONSTRAINT FKD1111B00C05F2ED6 FOREIGN KEY (RUN_ID) REFERENCES APP.RUNS (ID) ON UPDATE NO ACTION ON DELETE NO ACTION: 'ALTER TABLE' cannot be performed on 'APP.ACTION_ATTRIBUTES' because it does not exist.:

我发现在我的变更集列表中,使用ALTER TABLE进行的第一个变更集失败了,看起来所有先前的变更集都无法正常工作,但是我在控制台中看到了:

I see that in the list of my changesets that failed the first changeset with ALTER TABLE, it looks like all previous changesets did not work, but I see in the console:

INFO 8/20/12 4:08 PM:liquibase: Successfully acquired change log lock
INFO 8/20/12 4:08 PM:liquibase: Creating database history table with name: DATABASECHANGELOG
INFO 8/20/12 4:08 PM:liquibase: Reading from DATABASECHANGELOG
INFO 8/20/12 4:08 PM:liquibase: Reading from DATABASECHANGELOG
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-    changelog.xml::1345376497537-1::pavelber (generated) ran successfully in 56ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-2::pavelber (generated) ran successfully in 29ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-3::pavelber (generated) ran successfully in 42ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-4::pavelber (generated) ran successfully in 29ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-5::pavelber (generated) ran successfully in 190ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-6::pavelber (generated) ran successfully in 32ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-7::pavelber (generated) ran successfully in 26ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-8::pavelber (generated) ran successfully in 23ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-9::pavelber (generated) ran successfully in 15ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-10::pavelber (generated) ran successfully in 31ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-11::pavelber (generated) ran successfully in 26ms
INFO 8/20/12 4:08 PM:liquibase: ChangeSet com/cadence/mdv/ngv/initial-changelog.xml::1345376497537-12::pavelber (generated) ran successfully in 54ms
.....

从命令行运行时,相同的变更日志运行良好,因此我认为问题出在事务定义或类似的问题上.

The same changelog is working well while running from command line, so I suppose that the problem is in transaction definitions or something like this.

如何解决这个问题?

谢谢

推荐答案

了解profile.dbUrl是什么,以及profile.dbUser也可能会有所帮助.

It would be helpful to know what profile.dbUrl is, and possibly profile.dbUser, too.

Derby数据库中不存在表的最常见原因是因为作为嵌入式数据库引擎的Derby可以在整个位置具有数据库的多个副本,并且很容易混淆并使用与以下数据库不同的数据库你以为你是

The most common reasons for a table not existing in a Derby database are because Derby, being an embedded database engine, can have multiple copies of the database all over the place, and it's easy to get confused and use a different database than you think you are:

  1. 您的数据库是通过相对文件路径访问的,并且您的当前目录已更改,导致Derby访问其他数据库.
  2. 您的数据库是通过其他用户访问的,该用户名隐式定义了一个架构,因此未找到表,因为您的用户名已更改.
  3. 您的数据库是一个内存数据库,并且这些数据库不会在应用程序的生命周期内持续存在,因此,每次运行该数据库时,都会从一个没有表的新数据库开始.
  4. 您的应用程序创建其所有表并在一个巨大的事务中完成所有工作,并且不提交该事务,从而导致您的所有工作(包括所有表创建)在应用程序退出时被回滚.

还有其他可能的原因,但这是一些常见的原因.

There are other possible reasons, but these are some common ones.

这篇关于在Java中使用带有Derby Embedded的liquibase的异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆