web-dev-qa-db-ja.com

Flywayを使用して、環境ごとに条件付きでデータをロードする

Flywayは、環境ごとにスクリプトの条件付き実行をサポートしていますか?

たとえば、テストデータがある場合、envがテストとして構成されている場合にのみ読み込まれるテストデータスクリプトフォルダーを作成できますか?

15
fansonly

将来の訪問者にとって、これはDB固有のsqlのソリューションですが、データのロードにも適用されます。 https://flywaydb.org/documentation/faq#db-specific-sql

Flyway.locations = sql/common、sql/dataプロパティを設定できます。これは、Springプロファイル(dev/test/prod)で異なる値に設定でき、本番環境ではsql/dataスクリプトを省略します。

9
Busata

Mavenを使用している場合は、Mavenプロファイルのコンセプトを使用して非常に簡単に実現できます。以下のサンプルを参考にしてください

pom.xml

<plugin>
    <groupId>com.googlecode.flyway</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <url>jdbc:sqlserver://${db.hostname};databaseName=${db.name}</url>
        <user>${db.username}</user>
        <password>${db.password}</password>
        <initVersion>0</initVersion>
        <initDescription>Base Migration</initDescription>
        <table>Changelog_testproject</table>
        <locations>
           <location>filesystem:${sql.file.path}</location>
        </locations>
    </configuration>
</plugin>

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <profile.name>dev</profile.name>
            <sql.file.path>${basedir}/deploy/dev/sqldelta/sqlserver</sql.file.path> 
            <db.hostname>127.0.0.1:1433</db.hostname>
            <db.name>dev</db.name>
            <db.username>dev</db.username>
            <db.password>devadmin</db.password>
        </properties>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <profile.name>test</profile.name>
            <sql.file.path>${basedir}/deploy/test/sqldelta/sqlserver</sql.file.path>  
            <db.hostname>127.0.0.1:1433</db.hostname>
            <db.name>test</db.name>
            <db.username>test</db.username>
            <db.password>testadmin</db.password>
        </properties>
    </profile>
 </profiles>

flywayflywaydb

4
Sahul Yakoob

Mavenプロファイルでは、必要な柔軟性が得られませんでした。 antを使用してファイルをマージする戦略を思いつきました。これにより、共通のスクリプトを作成し、展開タイプに応じて追加のデータを含めることができます。 prod、dev。

これは私のプロジェクト構造です:

├── build.xml
├── database.properties
├── database.properties.template
├── lib
│   └── ant-contrib-1.0b3.jar
├── pom.xml
└── sql
    ├── common
    │   ├── V1.0__.sql
    │   ├── V1.2.1__.sql
    │   └── V1.3__.sql
    ├── dev
    │   ├── V1.0__.sql
    │   └── V1.3__.sql
    └── prod
        └── V1.0__.sql

ルートフォルダー内のdatabase.properties.templateファイル。実行する前に、手動でdatabase.propertiesにコピーする必要があり、ユーザー名とパスワードを入力できます。 database.propertiesはVCSで無視する必要があります。そうすることで、パスワードがレポに含まれないようになります。

deployTypeスクリプトはsrc/main/resources/db/migrateディレクトリにマージされます。これは、これを行うantスクリプトです。マージされるスクリプトは同じ名前を持つことに注意してください。

<project name="data" default="prepareSql">

    <property file="database.properties" />
    <property name="destDir" value="src/main/resources/db/migration" />

    <echo message="Deploy type: ${deployType}"/>

    <taskdef resource="net/sf/antcontrib/antcontrib.properties">
      <classpath>
        <pathelement location="lib/ant-contrib-1.0b3.jar"/>
      </classpath>
    </taskdef>

    <target name="prepareSql">
        <!-- ensure the dest dir exists -->
        <mkdir dir="${destDir}"/>

        <!-- clear out the dest dir -->
        <delete>
            <fileset dir="${destDir}">
                <include name="*" />
            </fileset>
        </delete>

        <!-- append the deploy type files to the common files, delegate to the append target -->
        <foreach target="append" param="file">
            <fileset dir="sql/common" casesensitive="yes">
                <include name="*" />
            </fileset>
        </foreach>
    </target>

    <target name="append">
        <basename property="basename" file="${file}" />
        <property name="destFile" value="${destDir}/${basename}"/>
        <echo message="Appending ${file} to ${destFile}" />

        <concat destfile="${destFile}" >
            <filelist dir="sql/common" files="${basename}" />
            <filelist dir="sql/${deployType}" files="${basename}" />
        </concat>
    </target>
</project>

このantファイルはmavenによって実行されます。pom設定は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>data</groupId>
    <artifactId>data</artifactId>
    <version>1.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>data</name>

    <properties>
        <sqlBaseDir>filesystem:${basedir}/src/main/resources/</sqlBaseDir>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <id>mergeScripts</id>
                        <phase>validate</phase>
                        <inherited>false</inherited>
                        <configuration>
                            <target>
                                <ant antfile="build.xml" target="prepareSql" />
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>3.2.1</version>
                <configuration>
                    <schemas>
                        <schema>common</schema>
                    </schemas>
                    <configFile>database.properties</configFile>
                    <table>flyway</table>
                    <locations>
                        <location>filesystem:${basedir}/src/main/resources/db/migration</location>
                    </locations>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-Java</artifactId>
            <version>5.1.36</version>
        </dependency>
    </dependencies>
</project>

異なるクライアントディストリビューションに異なるデータが必要な場合は、distディレクトリをsqlディレクトリに追加し、それらにdeployTypeサブディレクトリを含めることができます。

Distプロパティをdatabase.properties.templateファイルに追加し、build.xmlの追加ターゲットを次のように変更します。

<target name="append">
    <basename property="basename" file="${file}" />
    <property name="destFile" value="${destDir}/${basename}"/>
    <echo message="Appending ${file} to ${destFile}" />

    <concat destfile="${destFile}" >
        <filelist dir="sql/common" files="${basename}" />
        <filelist dir="sql/${deployType}" files="${basename}" />
            <filelist dir="sql/${dist}/common" files="${basename}" />
            <filelist dir="sql/${dist}/${deployType}" files="${basename}" />
    </concat>
</target>
4
Rian

flyway placeholderを使用できます:

環境のconfig.propertiesで構成します。

flyway.placeholders .tableName= MY_TABLE

flyway.placeholders .name= 'Mr。テスト'

次に、それをスクリプトに追加します。INSERT INTO $ {tableName}(name)VALUES($ {name});

私もflyway.locationsを使用しましたが、単純な変更の場合、プレースホルダーは場所よりも単純です。

2
DeividSilva