【问题标题】:Is flyway database agnostic in its support for multiple databases?flyway 数据库是否支持多个数据库?
【发布时间】:2011-11-10 17:02:41
【问题描述】:

Flyway 是否适合在支持多个数据库的应用程序中实现?

我们不知道我们的客户使用的是什么——可能是 MySQL、Postgres 或 Oracle。我们还可以使用 Flyway 为新版本的应用程序迁移数据库吗?

【问题讨论】:

    标签: flyway


    【解决方案1】:

    如果您的问题是:Flyway 是否提供跨其支持的数据库的 DDL 抽象层,答案是

    这是一个有意识的设计决定,以确保底层数据库的全部功能可用,而不仅仅是迁移工具支持的最小公分母。

    对于您的用例,您可以为不同的数据库提供不同的迁移脚本。不过它们应该非常相似。

    如果您不希望潜在地复制迁移脚本并且可以使用 最小公分母 方法,请查看 LiquiBase,这可能会更好适合您的用例(如果您可以使用 XML)

    【讨论】:

    • Axel,如果为不同的数据库提供相同的迁移脚本,如何选择要使用的数据库?像 V1__ORACLE_InitalVersion.sql 和 V1__MSSQL_InitialVersion.sql 这样的东西可能吗?
    • 一种可能是根据您的环境配置 flyway.baseDir,其中一个目录用于 SQL Server 迁移,一个用于 Oracle 迁移。
    • 是否可以只为那些不同的东西设置单独的脚本?如果前三个版本是标准sql,但是第四个版本需要一个特殊的脚本,比如说SQL Server,那你能保留通用脚本吗?
    • @homaxto 是的,你可以。您可以为通用脚本创建一个目录,然后为每个数据库创建一个用于特定脚本的单独目录。
    【解决方案2】:

    您可以使用jOOQ's parsing connection,它封装了您的目标 JDBC 连接,并且能够将您的输入 DDL 转换为任何目标方言(如果它不是太花哨和特定于供应商的话)。 Flyway 不会知道这个翻译 JDBC 代理,也不必知道。可以在这里看到SQL translator 的在线版本。例如,如果您的输入 SQL 是特定于 MySQL 的:

    create table t (i int primary key auto_increment);
    

    输出可能是:

    -- Oracle
    create table T (
      I number(10) generated by default as identity(start with 1) not null,
      primary key (I)
    );
    
    -- SQL Server
    create table T (
      I int identity(1, 1) not null,
      primary key (I)
    )
    
    -- PostgreSQL
    create table T (
      I int generated by default as identity not null,
      primary key (I)
    )
    
    -- PostgreSQL 9.4
    create table T (
      I serial4 not null,
      primary key (I)
    )
    

    免责声明:我为 jOOQ 背后的公司工作。

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 2012-02-14
      • 2020-08-18
      • 2019-09-04
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2010-09-07
      相关资源
      最近更新 更多