ebean-orm / ebean-migration

DB Migration runner (similar to Flyway) which can be used standalone or with Ebean (run migrations on EbeanServer start)
Apache License 2.0
9 stars 5 forks source link

platform directories not respected when applying migrations generated for multiple platforms #162

Open Incanus3 opened 2 hours ago

Incanus3 commented 2 hours ago

Hi guys. We just started experimenting with ebean-migration and encountered some problems. We have a migration generation script like this:

fun main(args: Array<String>) {
    System.setProperty("spring.profiles.active", "kb-dev")
    System.setProperty("spring.main.banner-mode", "off")
    System.setProperty("spring.main.web-application-type", "none")
    System.setProperty("logging.level.root", "WARN")
    System.setProperty("kb.background.run-jobs", "false")
    System.setProperty("kb.architecture.load-registry-network", "false")

    val context = runApplication<QwazarKB>(*args)
    val database = context.getBean(INDEX_DB_QUALIFIER, Database::class.java)

    val migration = DbMigration.create().apply {
        setServer(database)

        addPlatform(Platform.H2)
        addPlatform(Platform.POSTGRES)
        addPlatform(Platform.ORACLE)
        addPlatform(Platform.SQLSERVER17)

        setIncludeIndex(true)

        // setApplyPrefix("3.14.0-") // TODO: change before running!
        setName("add ZkratkaListRow") // TODO: change before running!

        // TODO: can we somehow deduce this?
        setPathToResources("backends/kb/src/main/resources")
    }

    migration.generateMigration()
}

this correctly generates a directory structure like this

Screenshot_20241101_140509

then when I'm trying to apply these migrations in H2, all of the SQL files (not just the two H2-specific ones) are found and attempted to be applied, as you can see in this debugger screenshot

Screenshot_20241101_140145

And this results in the following error when applying I__create_procs.sql (which is SQL server specific!):

Caused by: io.ebean.migration.MigrationException: Error running DB migrations
    at io.ebean.migration.runner.MigrationEngine.run(MigrationEngine.java:93) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.runner.MigrationEngine.run(MigrationEngine.java:44) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.MigrationRunner.run(MigrationRunner.java:100) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.MigrationRunner.run(MigrationRunner.java:72) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.MigrationRunner.run(MigrationRunner.java:65) ~[ebean-migration-14.2.0.jar:14.2.0]
    at cz.sentica.qwazar.kb.configuration.persistence.IndexPersistenceConfiguration.indexDatabase(IndexPersistenceConfiguration.kt:79) ~[main/:na]
    at cz.sentica.qwazar.kb.configuration.persistence.IndexPersistenceConfiguration$$SpringCGLIB$$0.CGLIB$indexDatabase$4(<generated>) ~[main/:na]
    at cz.sentica.qwazar.kb.configuration.persistence.IndexPersistenceConfiguration$$SpringCGLIB$$FastClass$$1.invoke(<generated>) ~[main/:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258) ~[spring-core-6.1.13.jar:6.1.13]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:348) ~[spring-context-6.1.13.jar:6.1.13]
    at cz.sentica.qwazar.kb.configuration.persistence.IndexPersistenceConfiguration$$SpringCGLIB$$0.indexDatabase(<generated>) ~[main/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:146) ~[spring-beans-6.1.13.jar:6.1.13]
    ... 93 common frames omitted
Caused by: java.sql.SQLException: Error executing [if not exists (select name  from sys.types where name = 'ebean_bigint_tvp') create type ebean_bigint_tvp as table (c1 bigint)] error[Syntax error in SQL statement "[*]if not exists (select name  from sys.types where name = 'ebean_bigint_tvp') create type ebean_bigint_tvp as table (c1 bigint)"; SQL statement:
if not exists (select name  from sys.types where name = 'ebean_bigint_tvp') create type ebean_bigint_tvp as table (c1 bigint) [42000-224]]
    at io.ebean.ddlrunner.DdlRunner.runStatement(DdlRunner.java:106) ~[ebean-ddl-runner-2.3.jar:2.3]
    at io.ebean.ddlrunner.DdlRunner.runStatements(DdlRunner.java:72) ~[ebean-ddl-runner-2.3.jar:2.3]
    at io.ebean.ddlrunner.DdlRunner.runAll(DdlRunner.java:55) ~[ebean-ddl-runner-2.3.jar:2.3]
    at io.ebean.migration.runner.MigrationScriptRunner.runScript(MigrationScriptRunner.java:34) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.runner.MigrationTable.executeMigration(MigrationTable.java:432) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.runner.MigrationTable.executeMigration(MigrationTable.java:406) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.runner.MigrationTable.runMigration(MigrationTable.java:326) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.runner.MigrationTable.shouldRun(MigrationTable.java:286) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.runner.MigrationTable.runAll(MigrationTable.java:524) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.runner.MigrationEngine.runMigrations(MigrationEngine.java:131) ~[ebean-migration-14.2.0.jar:14.2.0]
    at io.ebean.migration.runner.MigrationEngine.run(MigrationEngine.java:76) ~[ebean-migration-14.2.0.jar:14.2.0]
    ... 108 common frames omitted
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]if not exists (select name  from sys.types where name = 'ebean_bigint_tvp') create type ebean_bigint_tvp as table (c1 bigint)"; SQL statement:
if not exists (select name  from sys.types where name = 'ebean_bigint_tvp') create type ebean_bigint_tvp as table (c1 bigint) [42000-224]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.message.DbException.getSyntaxError(DbException.java:247) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.command.ParserBase.getSyntaxError(ParserBase.java:748) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.command.Parser.parsePrepared(Parser.java:773) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.command.Parser.parse(Parser.java:592) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.command.Parser.parse(Parser.java:569) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.command.Parser.prepareCommand(Parser.java:483) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:245) ~[h2-2.2.224.jar:2.2.224]
    at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:231) ~[h2-2.2.224.jar:2.2.224]
    at io.ebean.ddlrunner.DdlRunner.runStatement(DdlRunner.java:101) ~[ebean-ddl-runner-2.3.jar:2.3]
    ... 118 common frames omitted

I guess I can work around this by setting a narrower migrationPath, but then this code would have to be changed btw platforms.

Incanus3 commented 2 hours ago

I tried setting MigrationConfig.migrationPath to db.platform().base().name.lowercase() and then it does work, but this doesn't seem like it should be needed.