如何使用 flyway 填充种子数据

How to populate seed data using flyway

我们有一个国家table,其中包含永远不会改变的国家名称。

如何在应用程序上使用 flyway 填充国家/地区特定的种子数据,最好使用相同的主键启动,这样它就不会在不同环境(比如开发、质量保证、生产)中发生变化

这在某种程度上取决于您的数据库结构,但您可以将国家/地区名称的插入语句作为具有设置主键的迁移脚本。

如果您将 Flyway 作为 Java 应用程序的一部分,您将在应用程序启动时使用 Flyway Migrate 运行。这将允许应用程序在 运行 时将国家/地区名称部署到新环境,并且由于它是一个迁移脚本,如果环境已经 运行 之前它不会再次 运行将在架构历史记录 table 中。如果需要更多名称,您还可以添加到 table 并通过后续迁移脚本更改名称。

唯一的问题是确保在您创建的迁移脚本之外没有任何其他内容添加到此 table,因为主键冲突会导致迁移失败。

你可以使用 flyway migrate 假设这是第一次方案修改(否则从连续 V# 开始)

V1__create_countries_table.sql:

create table COUNTRY (
    ID int not null,
    NAME varchar(100) not null
    -- additional fields and constraints
);

V2__add_values_to_country_talble.sql:

insert into COUNTRY (ID, NAME) values (1, 'Afghanistan');
insert into COUNTRY (ID, NAME) values (2, 'Albania');
... 

因为这是数据是静态的和不可变的,你可以通过在你的 java Country Jpa Reporsitory 上用 throw new UnsupportedOperationException("country table is read only")

覆盖 create/update/delete 来保护它

在 SQL 数据库中,您应该使用视图来执行此操作。这些被认为是 DDL,将包含在所有构建脚本中,而数据插入则不是。它们是 read-only,因此黑客无法添加虚假货币等。这是一个相当不切实际的示例,它允许您查找 Brythonic 语言中使用的单词以计数到二十。

CREATE VIEW BrythonicCounting
AS
  SELECT TheName, TheValue
    FROM
      (VALUES ('oinos', 1), ('dewou', 2), ('trīs ', 3), ('petwār', 4),
              ('pimpe', 5), ('swexs', 6), ('sextam', 7), ('oxtū', 8),
              ('nawam', 9), ('dekam', 10), ('oindekam', 11),
              ('deudekam', 12), ('trīdekam', 13), ('petwārdekam', 14),
              ('penpedekam', 15), ('swedekam', 16), ('sextandekam', 17),
              ('oxtūdekam', 18), ('nawandekam', 19), ('ukintī', 20)
      ) Brythonic ( TheName, TheValue);
go
Select TheName from BrythonicCounting where Thevalue=12;

如您所见,数据在视图的定义中并且是 DDL 的一部分,因此将成为架构的一部分,而不是数据。

你没有说你使用的是什么关系数据库系统,但几乎每个关系数据库都支持这种语法。对于其中包含静态 read-only 数据的视图。

go
CREATE VIEW AltBrythonicCounting
AS
  SELECT TheName, TheValue
    FROM
      (select 'oinos', 1
      UNION
       SELECT 'dewou', 2
      UNION 
        SELECT 'trīs ', 3
      UNION 
       SELECT 'petwār', 4
      ) Brythonic ( TheName, TheValue);
go
Select * from AltBrythonicCounting