2016-08-30 11 views
1

これが可能かどうかはわかりませんが、Flyway Java APIを使用してプログラムでSQLファイルに保存された移行をロードしようとしています。私はFlyway Java APIでSQL移行ファイルを使用

Flyway flyway = new Flyway(); 
flyway.setDataSource(jdbc_url, user, password); 
int migrations = flyway.migrate(); // Just to check the # of migrations applied 

使用するJavaプログラムに続いて

CREATE TABLE test_user (
    name VARCHAR(25) NOT NULL, PRIMARY KEY(name) 
); 

:私は、単純なテーブル作成ステートメントを使用してとして(今の簡略化のため)基本クラスパスに保存されたSQLファイルV1__Initial_version.sqlを持っています私はClassPathScannerが有効な移行のためのクラスパスを見て参照してください、それはSQL移行ファイルを無視するようです。 flywayマイグレーションをコマンドラインから呼び出すと、同じsql移行ファイルが正常に動作します。私はJavaクラスを作成し、JdbcMigrationsクラスから継承し、ClassPathScannerはそれをうまく選択します。 .sqlファイルをJava ClassPathScannerで取得して有効な移行として使用するには、何が必要ですか?

BIGGER PICTURE私は私が何をしようとしている追加しますので、たぶん私は最初の場所で誤っこれについてつもり

。私は、使用することができ、テストの間に再構築することができるテストDBをセットアップしようとしています。 I. TestAがテーブルに何かを入力すると、事前テスト機能はDBをクリーンアップしてリセットし、TestBはクリーンなDBと空のテーブルを持ち、テストを実行します。私は、事前テスト機能でflyway.clean()とflyway.migrate()を使用していますが、schema_versionテーブルを他のものと一緒に破棄してから、移行は以前のベースラインから再構築しません。

ご協力いただきましてありがとうございます。ありがとう!

+0

setLocations()を使用します。データ、はい、しかしスキーマですか?私はDbSetup(http://dbsetup.ninja-squad.com/)を使用します。免責事項:私は著者です。 –

+0

あなたは正しいですが、実際にはスキーマをヌックにする点はありません。私がしようとしているのは、データをクリアすることですが、** flyway.clear **を使用すると、私のスキーマテーブルも削除されます。私は、飛行機がデータをクリアするだけでなく、テーブルとスキーマを残す別の方法を見ていませんでした。 –

+2

それは、フライウェイのためではありません。 Flywayの仕事はスキーマの進化を作ることです。 –

答えて

3

マイグレーションが実行されないのはなぜか分かりません。たぶん彼らは特定のディレクトリにいる必要がありますか? srcコードをチェックして、ファイルが移行対象にならない理由を確認する必要があります。大きな画像について

私たちは通常、フライウェイを使用してテスト・データベースを移行:私たちは、ビルドやテストケースを実行する前に移行します。 DBUnit、Springテスト、または同様のユニットテストフレームワークを使用して、データで事前テストDBを設定できます。テスト中に構造が変更されるべきではないため、dbの移行は必要ありません。 Arquillianは、EDIT 1

こちらをご覧https://github.com/arquillian/arquillian-extension-persistence

、同様のテストを実行する前に、DBの初期化のために非常に便利ですので、私は

import org.flywaydb.core.Flyway; 
public class TestClass { 
public static void main(String args[]) { 
    Flyway flyway = new Flyway(); 
    for (String location : flyway.getLocations()) { 
     System.out.println(location); 
    } 
    flyway.setDataSource("jdbc:h2:~/test", "sa", ""); 
    System.out.println("Result: " + flyway.migrate()); 
} 
} 

小さな例を作成することができますsrc/main/resources/db/migrationにSQLファイルを入れて、それを実行しました。それはSQLの移行をうまく拾う。あなたが別のディレクトリにSQLを置きたい場合は、私は本当にスキーマをニューキングのポイントを理解していない

classpath:db/migration 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.util.VersionPrinter printVersion 
INFO: Flyway 4.0.3 by Boxfuse 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.dbsupport.DbSupportFactory createDbSupport 
INFO: Database: jdbc:h2:~/test (H2 1.4) 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbValidate validate 
INFO: Successfully validated 1 migration (execution time 00:00.009s) 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbMigrate migrate 
INFO: Current version of schema "PUBLIC": << Empty Schema >> 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbMigrate applyMigration 
INFO: Migrating schema "PUBLIC" to version 1.1 - Initial version 
Result: 1 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbMigrate logSummary 
INFO: Successfully applied 1 migration to schema "PUBLIC" (execution time 00:00.024s).

+0

私は、マイグレーションファイルをjavaクラスのマイグレーションと同じ場所に配置しました。マイグレーションファイルは、フライウェイのクラスパスにあります。javaクラスは取得されますが、SQLファイルは取得されません。 –

+1

私が言及したdbユニットテストフレームワークの1つを使用します。 dbをクリアすることは、すべての制約を無効にし、すべてのテーブルを切り捨てる単純なSQLになります。フライウェイを使用して各テストのDBスキーマを構築すると、特にDB移行とテストの回数が増えると、うまく拡張できません。 – Guenther

+0

ありがとう、それはJB Nizetがコメントに与えたアドバイスと同様で、問題の一部を解消します。私はまだJava JdbcMigrationクラスではなく、SQLからベース・マイグレーションを取得したいと考えています。 –

関連する問題