占位符如何在Flyway中运作?

时间:2012-02-23 17:36:31

标签: flyway

我正在评估Flyway在我的项目中使用。我们当前的SQL脚本包含诸如URL的占位符,这些URL将根据环境(dev,qa,prod)具有不同的域名。

具体来说,我们可能有像

这样的INSERT语句
INSERT INTO FEED VALUES ('app.${env.token}.company.org/feed1', 'My Feed');

$ {env.token}需要替换为' dev',' qa'或' prod'。

我们有大约50种可能需要在SQL脚本中替换的不同属性。这些属性都驻留在一个或两个属性文件中。

有没有办法运行Flyway Ant迁移任务,以便从属性文件中提取替换标记和值?什么东西沿着Ant过滤器任务?

4 个答案:

答案 0 :(得分:10)

目前,在将占位符作为属性提供时,属性名称应以 flyway.placeholders为前缀。

例如, $ {env.token} 占位符可以直接指定为此Ant属性: flyway.placeholders.env.token

目前不支持直接传递属性文件,而不使用属性名称的前缀。随意在Issue Tracker中提出问题。 : - )

答案 1 :(得分:7)

如果令牌为subdomain

INSERT INTO FEED VALUES ('app.${subdomain}.company.org/feed1', 'My Feed');

flyway.conf中的值:

flyway.url=jdbc:mydb://db
flyway.user=root
flyway.schemas=schema1
flyway.placeholders.subdomain=example

或命令行:

flyway -url=jdbc:mydb://db -user=root -schemas=schema1 -placeholders.subdomain=example migrate

将脚本运行为:

INSERT INTO FEED VALUES ('app.example.company.org/feed1', 'My Feed');

答案 2 :(得分:0)

Maven版本:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-maven-plugin</artifactId>
            <configuration>
                <url>jdbc:mysql://localhost/cloud</url>
                <user>root</user>
                <password>root</password>
                <placeholderReplacement>false</placeholderReplacement>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>${mysql.version}</version>
                    <scope>runtime</scope>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

答案 3 :(得分:0)

根据我的经验,使用环境变量要容易得多 而不是CLI或配置文件(尤其是在使用docker和k8s时)。

您可以使用以下格式的环境变量-

export FLYWAY_PLACEHOLDERS_USER=${USER}

然后在您的sql语句中,像这样使用此变量-

INSERT INTO tmptable (user)
VALUES ('${user}')

详细了解环境变量here