无法为 PostgreSQL 表应用 Flyway 迁移

Posted

技术标签:

【中文标题】无法为 PostgreSQL 表应用 Flyway 迁移【英文标题】:Cannot apply Flyway migration for a PostgreSQL table 【发布时间】:2021-08-29 19:56:32 【问题描述】:

在我的 Java 应用程序中,我有以下迁移文件:

-- code omitted for brevity 

create table if not exists demo_table
(
    id                  bigint       not null,
    "company"           varchar(50)  not null,
    "name"              varchar(50)  not null
    );

create unique index if not exists demo_table_uuid_company_key
    on demo_table (uuid, "company");
    
create index if not exists demo_table_name_company_key
    on demo_table ("name", "company");

虽然我可以在 PostgreSQL 查询窗口上运行 sql part part 部分或一次运行,但在运行我的 Java 应用程序时,它会引发以下错误:

“无法在表 demo_table 上创建索引(名称,公司):找不到数据库列“名称”。请确保使用正确的列名称,这取决于使用的命名策略(可能不是与实体中的属性名称相同,尤其是关系类型)"

我尝试了很多东西,例如从flyway_schema_history 表中删除相关的迁移行,删除demo_table 上的索引等。但仍然是同样的错误。如果我尝试从name 中删除双引号 (""),则会出现校验和错误。所以,由于name 是保留字,我使用双引号。我该如何解决?

另一方面,我不确定是否应该在application.yml 上更改这些参数:

spring:
  flyway:
    enabled: true

  jpa:
    hibernate:
      ddl-auto: update

【问题讨论】:

还有其他人使用 Flyway 迁移或 PostgreSQL 吗? 【参考方案1】:

脚本的一些小问题: 创建的第一列缺少逗号。 此列也称为id,但索引引用uuid

解决此问题后,脚本可以完美地为我工作(使用引号)

如果您进行这些更改并收到校验和错误,请运行flyway repair

【讨论】:

非常感谢,投了赞成票。实际上我只是错过了问题中的逗号,但它存在于代码中。另一方面,如何运行 flyway 脚本?

以上是关于无法为 PostgreSQL 表应用 Flyway 迁移的主要内容,如果未能解决你的问题,请参考以下文章

通过 Flyway SQL 脚本为 PostgreSQL 中新创建的列设置不为空

无法在 Spring 应用程序中使用 Flyway 1.6 进行迁移

Flyway - 自动增量 ID 不适用于 PostgreSQL 中的测试数据

带有PostgreSQL,Flyway和Hikari的Spring Boot 2:驱动程序声称不接受jdbcUrl

使用 Flyway 和 Docker 容器内的嵌入式 Postgresql 运行测试时出现 java.net.ConnectException

PostgreSQL ‘数据库不存在’ - Java Spring Boot、Flyway、Docker/PostgreSQL