Flywayは、環境ごとにスクリプトの条件付き実行をサポートしていますか?
たとえば、テストデータがある場合、envがテストとして構成されている場合にのみ読み込まれるテストデータスクリプトフォルダーを作成できますか?
将来の訪問者にとって、これはDB固有のsqlのソリューションですが、データのロードにも適用されます。 https://flywaydb.org/documentation/faq#db-specific-sql
Flyway.locations = sql/common、sql/dataプロパティを設定できます。これは、Springプロファイル(dev/test/prod)で異なる値に設定でき、本番環境ではsql/dataスクリプトを省略します。
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>
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>
flyway placeholderを使用できます:
環境のconfig.propertiesで構成します。
flyway.placeholders .tableName= MY_TABLE
flyway.placeholders .name= 'Mr。テスト'
次に、それをスクリプトに追加します。INSERT INTO $ {tableName}(name)VALUES($ {name});
私もflyway.locationsを使用しましたが、単純な変更の場合、プレースホルダーは場所よりも単純です。