Flyway 数据库迁移到多个模式

Posted

技术标签:

【中文标题】Flyway 数据库迁移到多个模式【英文标题】:Flyway database migration to multiple schemas 【发布时间】:2015-02-17 05:23:24 【问题描述】:

我已经为我的多租户应用程序设置了一个迁移脚本。问题是。它只为我在参数上指定的第一个租户/模式生成脚本。这是我的 sql 脚本

drop table if exists ADMIN_ACCOUNT cascade;

drop table if exists PERSON_NAME cascade;

drop table if exists USER_ACCOUNT cascade;

create table ADMIN_ACCOUNT (
    id int8 not null,
    created_date timestamp,
    PASSWORD varchar(255),
    USERNAME varchar(255),
    membershipType varchar(255),
    NAME_ID int8,
    primary key (id)
);

create table PERSON_NAME (
    id int8 not null,
    created_date timestamp,
    FIRST_NAME varchar(255),
    LAST_NAME varchar(255),
    MIDDLE_NAME varchar(255),
    account_id int8,
    primary key (id)
);

create table USER_ACCOUNT (
    id int8 not null,
    created_date timestamp,
    PASSWORD varchar(255),
    USERNAME varchar(255),
    ROLE varchar(255),
    TENANT_CODE varchar(255),
    NAME_ID int8,
    primary key (id)
);

alter table ADMIN_ACCOUNT
add constraint FK_fil1krx8k0osj713tg44ia0vu
foreign key (NAME_ID)
references PERSON_NAME;

alter table PERSON_NAME
add constraint FK_hc1g7pa0rseytw9o1pcuo0mpw
foreign key (account_id)
references USER_ACCOUNT;

alter table USER_ACCOUNT
add constraint FK_ib2pk4at20vxm3onaoro6ry2r
foreign key (NAME_ID)
references PERSON_NAME;

这是我输入到 flyway mvn compile flyway:migrate -Dflyway.schemas=tenant3,tenant4,tenant5 -Dflyway.baselineOnMigrate=true 的命令

它只为第一个租户(tenant3)生成表。

这是一个错误吗?还是错过了什么?

【问题讨论】:

AFAIK schemas 属性允许您在 SQL 语句中切换模式。所以在这里你必须创建两次USER_ACCOUNT 表,使用 2 个单独的脚本,每个模式一个。在这里,您可以读到只有第一个模式被视为默认模式:flywaydb.org/documentation/maven/migrate.html ... 所以您必须在尝试将迁移推送到非默认模式时指定。我也很想一次将迁移推送到两个多个模式中。一种用于开发的模式,一种用于测试的模式。仍在寻找解决方案;) 【参考方案1】:

要创建多个相同的架构,您必须为每个架构调用一次 Flyway,并将 flyway.schemas 属性设置为正确的值。 Flyway 然后会将正确的架构设置为默认架构,让您以不变的方式运行迁移脚本(只要您不为对象名称添加前缀)。

【讨论】:

从模式的文档看来,如果我提供一个逗号分隔的模式列表,它将在所有模式上运行,但这在 migrate 命令中不起作用。我错过了什么吗? 这样做会在每个模式中创建 flyway_schema_history 表 - 基本上在单独的表中跟踪每个模式。是这样吗? 我会说“模式”设置的迁移名称令人困惑。因为您必须手动构建一个循环并在循环中为复数“模式”设置提供一个 single 模式名称。据我了解,对于 Postgres,您只需执行“SET search_path=value_provided_for_schemas_setting;”因此,如果迁移脚本没有以架构名称为前缀(通常情况下它们应该是),您将部署到特定架构中。在这种情况下,将其称为 current_deployed_schema 或类似名称更合乎逻辑【参考方案2】:

请从 flyway 中找到建议,如

http://flywaydb.org/documentation/faq.html#multiple-schemas

希望这会有所帮助。

【讨论】:

以上是关于Flyway 数据库迁移到多个模式的主要内容,如果未能解决你的问题,请参考以下文章

Flyway 3.1 数据库迁移多个模式 - Oracle 11g

使用 Flyway 和 Spring Boot 迁移具有不同生命周期的多个模式

Flyway 一个模式中的多个元数据表

使用 Maven + Flyway 迁移/清理/等多个数据库

检测到的已解决迁移未应用于 flyway 上的数据库

如何将 Flyway 迁移与单个架构和多个项目一起使用