Flyway可以在同一个迁移脚本中容纳不同的SQL方言吗?



在我的公司,我们管理一个使用PostgreSQL作为数据库解决方案的SaaS基础设施。然而,一些客户希望我们执行内部部署,在其中他们提供MySQL代替。

这当然需要识别和隔离pg特定的数据类型和函数,找到相应的MySQL等同物,并使它们正常运行。

如果我们使用Liquibase,这将很容易,因为它需要我在这样的前提下编写databaseChangeLog(s):

<preConditions onFail="HALT">
<dbms type="mysql"/>
</preConditions>

,并在同一个databaseChangeLog中包含尽可能多的

然而,对于Flyway,似乎唯一可能的方法是定义不同的文件夹,在其中放置特定RDBMS的SQL文件。

这对我来说似乎相当过分和容易出错,所以我想知道:Flyway是否有一些我错过的特定语法,这允许我在相同的.sql文件中编写不同的sql方言特定查询?例如,我假设期望这样的内容:

--; if(mysql)
CREATE TABLE test (start_date TIMESTAMP NOT NULL);
--; endif
--; if(postgresql)
CREATE TABLE test (start_date TIMESTAMPTZ NOT NULL);
--; endif
...

提前感谢!

这不是flyway的特性。flyway中的SQL脚本应该是纯有效的SQL(除了一些变量注入的例外)。

但是,您可能能够查看Java迁移来执行条件执行,但您将无法使用现有的SQL脚本。

Flyway不支持迁移文件中的条件块,但是SQL方言可以使用相同的迁移脚本。

我使用flyway占位符来完成此操作,而不是使用条件块。我这里有一个技术演示,使用PowerShell作为粘合剂。您的应用程序听起来很有趣,我对可以安装在使用不同品牌RDBMS的各种环境中的应用程序有相同的要求,并且我可以看到块结构的价值。我使用占位符的原因是SQL方言之间的差异通常是相当微不足道的。也许多种技术的结合会是一个赢家。

我猜你可以将SQL条件块与占位符一起使用。然后,您只需要一个占位符,其中包含rdbms的名称,取自flyway.conf jdbc连接字符串。

最新更新