问题
I'm making Liquibase migration using groovy script.
I have a code like
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.:
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.
How to solve this problem?
Thank you
回答1:
It would be helpful to know what profile.dbUrl is, and possibly profile.dbUser, too.
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:
- Your database is accessed via a relative file path, and your current directory has changed, causing Derby to access a different database
- Your database is accessed via a different user, and the user name implicitly defines a schema, and so the tables are not found, because your user name has changed.
- Your database is an in-memory database, and those don't persist beyond the lifetime of your application, so each time you run it you start with a fresh database with no tables in it.
- Your application creates all its tables and does all its work in one giant transaction, and doesn't commit that transaction, causing all your work, including all your table creations, to be rolled back when your application exits.
There are other possible reasons, but these are some common ones.
来源:https://stackoverflow.com/questions/12038840/exception-using-liquibase-from-java-with-derby-embedded