1

flyway test extension 1.7.0 でプレースホルダーを使用しようとしています。flyway.properties でプレースホルダーを定義しました。

  flyway.placeholders.schema_name=MYSCHEMA

私のSQLスクリプトは次のようになります:

  create schema ${schema_name};

フライウェイ テストを実行すると、次のエラーが発生します。

117157 [main] DEBUG com.googlecode.flyway.core.migration.sql.SqlScript  - Found statement at line 1: create schema ${schema_name};
117157 [main] DEBUG com.googlecode.flyway.core.migration.sql.SqlStatement  - Executing SQL: create schema ${schema_name}
117157 [main] ERROR com.googlecode.flyway.core.migration.DbMigrator  - com.googlecode.flyway.core.exception.FlywayException: Error executing statement at line 1: create schema ${schema_name}
117158 [main] ERROR com.googlecode.flyway.core.migration.DbMigrator  - Caused by org.hsqldb.HsqlException: Unknown JDBC escape sequence: {: {schema_name}
117158 [main] DEBUG com.googlecode.flyway.core.migration.DbMigrator  - Finished migrating to version 1.1 (execution time 00:00.005s)

そのため、プレースホルダーの置換が機能していないようです。ちなみに、flyway.properties ファイルは正常にロードされています (jdbc url などの他の値にも使用しています)。

誰かがここで何が問題なのか知っていますか?

EDIT1 Flyway クラスの configure メソッドが呼び出されていないようです。アプリケーション コンテキストに何かを追加する必要がありますか?

EDIT2私たちが見つけた1つの解決策は、アプリケーションコンテキストにプレースホルダーを設定することです:

<bean id="flyway" class="com.googlecode.flyway.core.Flyway"
    depends-on="dataSourceRef">
    <property name="dataSource" ref="dataSourceRef" />
    <property name="placeholders" >
      <map>
        <entry key="schema_name" value="${flyway.placeholders.schema_name}" />
     </map> 
    </property>
</bean>

しかし、私たちはまだより良い解決策を探しています...

4

1 に答える 1

0

返事遅れてすみません。今日初めてあなたの質問を見ました。

問題を承認しましたhttp://code.google.com/p/flyway-test-extensions/issues/detail?id=14も参照してください。

デフォルトの実装と例は、それがどのように機能するか、またはそれを解決するのに十分なユーティリティを提供するかを示していません。

ソリューションは、flyway-test-extensions の実装に依存するスプリング パーツでのみ実行できます。

a.) ソリューションの最初の部分

flyway.placeholdersの交換のため、完全な解決策ではありません。メソッドconfigureによってFlyway内で行われ、呼び出すことはできません。

あなたのアプリケーションコンテキストに以下を入れてください:

<!-- also need this as additional include part  -->

xmlns:util="http : //www.springframework.org/schema/util"
xsi:schemaLocation="
    http: // www.springframework.org/schema/util 
    http: // www.springframework.org/schema/util/spring-util-3.0.xsd

<!-- flyway part -->
<util:properties id="flyway.prop" location="/flyway.properties"/>

<bean id="flyway" class="com.googlecode.flyway.core.Flyway" depends-on="dataSourceRef">
    <property name="dataSource" ref="dataSourceRef"/>
    <property name="placeholders" ref="flyway.prop"/>
</bean>

ただし、flyway.properties ファイルよりも flyway.placeholders を削除する必要がありますプロパティ定義から。私は完全な解決策ではないと思います。

b.) 第二部

編集

より良い解決策は、現在の flyway-test-extension 開発からのチェックインを使用します

  • Flyway のファクトリ実装としての FlywayHelperFactory.java。これをテスト ソースの一部として配置します。
    これは 1.7 バージョンでも機能するはずです。
  • flywayPropertiesContext.xml を新しいアプリケーション コンテキストとして追加します。これを test/resources として context というディレクトリに置きます。
    これには、flyway.properties をロードする方法の 2 つのサンプル ソリューションが含まれています。
    注:
    このコンテキストでは jdbc.properties 変数を使用せず、代わりにフライウェイ プロパティを使用します。
    このコンテキストは flyway-test-extension 1.7.0 と連携する必要があります
  • テスト設定を変更@ContextConfiguration(locationsForMirgation = { "/context/flywayPropertiesContext.xml" })し、新しい構成として使用します。

フロリアン

于 2013-03-30T22:53:56.527 に答える