【问题标题】:No value provided for placeholder expressions没有为占位符表达式提供值
【发布时间】:2022-05-06 01:30:41
【问题描述】:

尽管设置了 flyway.placeholderReplacement=false,但我一直看到 Flyway 没有为 sql 中的占位符表达式提供值的错误

错误:意外错误 org.flywaydb.core.api.FlywayException:没有为占位符表达式提供值:& 条件。检查你的配置! 在 org.flywaydb.core.internal.database.oracle.pro.SQLPlusPlaceholderReplacer.replacePlaceholders(SQLPlusPlaceholderReplacer.java:132) 在 org.flywaydb.core.internal.util.line.PlaceholderReplacingLine.getLine(PlaceholderReplacingLine.java:36) 在 org.flywaydb.core.internal.database.ExecutableSqlScript.extractStatements(ExecutableSqlScript.java:156) 在 org.flywaydb.core.internal.database.ExecutableSqlScript.(ExecutableSqlScript.java:133) 在 org.flywaydb.core.internal.database.oracle.OracleSqlScript.(OracleSqlScript.java:61) 在 org.flywaydb.core.internal.database.oracle.OracleDatabase.doCreateSqlScript(OracleDatabase.java:126) 在 org.flywaydb.core.internal.database.Database.createSqlScript(Database.java:163) 在 org.flywaydb.core.internal.resolver.sql.SqlMigrationExecutor.getSqlScript(SqlMigrationExecutor.java:96) 在 org.flywaydb.core.internal.resolver.sql.SqlMigrationExecutor.executeInTransaction(SqlMigrationExecutor.java:109) 在 org.flywaydb.core.internal.command.DbMigrate.isExecuteGroupInTransaction(DbMigrate.java:312) 在 org.flywaydb.core.internal.command.DbMigrate.applyMigrations(DbMigrate.java:275) 在 org.flywaydb.core.internal.command.DbMigrate.migrateGroup(DbMigrate.java:244) 在 org.flywaydb.core.internal.command.DbMigrate.access $100(DbMigrate.java:53) 在 org.flywaydb.core.internal.command.DbMigrate$2.call(DbMigrate.java:163) 在 org.flywaydb.core.internal.command.DbMigrate$2.call(DbMigrate.java:160) 在 org.flywaydb.core.internal.database.Connection$1.call(Connection.java:145) 在 org.flywaydb.core.internal.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:74) 在 org.flywaydb.core.internal.database.Connection.lock(Connection.java:141) 在 org.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory.lock(JdbcTableSchemaHistory.java:150) 在 org.flywaydb.core.internal.command.DbMigrate.migrateAll(DbMigrate.java:160) 在 org.flywaydb.core.internal.command.DbMigrate.migrate(DbMigrate.java:138) 在 org.flywaydb.core.Flyway$1.execute(Flyway.java:947) 在 org.flywaydb.core.Flyway$1.execute(Flyway.java:910) 在 org.flywaydb.core.Flyway.execute(Flyway.java:1238) 在 org.flywaydb.core.Flyway.migrate(Flyway.java:910) 在 org.flywaydb.commandline.Main.executeOperation(Main.java:161) 在 org.flywaydb.commandline.Main.main(Main.java:108) 构建步骤“执行 shell”将构建标记为失败 完成:失败

【问题讨论】:

    标签: flyway


    【解决方案1】:

    flyway.placeholderReplacement=false 仅适用于 Flyway 占位符,不适用于 SQL*Plus 占位符。

    要禁用特定于 SQL*Plus 的占位符,您必须在脚本中包含 SET DEFINE OFF

    【讨论】:

      【解决方案2】:

      我认为,解决此错误的最佳方法是覆盖默认前缀和后缀

      flyway.placeholderPrefix=$${
      flyway.placeholderSuffix=}
      

      因为某些原因可能无法接受禁用此功能:例如,使用飞行路径变量。

      【讨论】:

        【解决方案3】:

        使用弹簧靴,在application.yml。 在下面添加placeholderReplacement: false

         flyway:
            baseline-on-migrate: false
            sql-migration-prefix: V
            table: migration
            placeholderReplacement: false
        

        发生这种情况,因为我的 .SQL 迁移文件中有带有 ${name} 的 HTML 代码。

        所以它试图替换它!我希望它按原样插入到数据库中。

        总结:在我的情况下,我希望它始终禁用,因为我没有使用它

        参考文献Possible Usages In Different Configuration

        【讨论】:

          【解决方案4】:

          如果您的用例与我的相似(您不能禁用占位符并且不能更改前缀),另一种方法是破坏占位符值。假设您的 SQL 是:

          UPDATE table SET value = '${variable}';
          

          您可以避免 FlyWay 拿起占位符,方法是:

          UPDATE table SET value = '$' + '{variable}';
          

          【讨论】:

            【解决方案5】:

            您可以使用 UTF-8 对整个字符串进行编码,然后在需要时对其进行解码

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-03-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多