在Java中使用带有Derby Embedded的liquibase的异常 [英] Exception using liquibase from Java with Derby Embedded
问题描述
我正在使用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:
- 您的数据库是通过相对文件路径访问的,并且您的当前目录已更改,导致Derby访问其他数据库.
- 您的数据库是通过其他用户访问的,该用户名隐式定义了一个架构,因此未找到表,因为您的用户名已更改.
- 您的数据库是一个内存数据库,并且这些数据库不会在应用程序的生命周期内持续存在,因此,每次运行该数据库时,都会从一个没有表的新数据库开始.
- 您的应用程序创建其所有表并在一个巨大的事务中完成所有工作,并且不提交该事务,从而导致您的所有工作(包括所有表创建)在应用程序退出时被回滚.
还有其他可能的原因,但这是一些常见的原因.
There are other possible reasons, but these are some common ones.
这篇关于在Java中使用带有Derby Embedded的liquibase的异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!