Postgres flyway 创建并发索引错误

Posted

技术标签:

【中文标题】Postgres flyway 创建并发索引错误【英文标题】:Postgres flyway create concurrently index error 【发布时间】:2021-09-05 06:06:50 【问题描述】:

我想做这样的事情:

CREATE OR REPLACE FUNCTION __column_exists(TEXT, TEXT, TEXT) RETURNS bool as $$
SELECT exists(SELECT 1 FROM information_schema.columns WHERE (table_schema, table_name, column_name) = ($1, $2, $3));
$$ language sql STRICT;

DO $$ BEGIN IF __column_exists('public', 'table_name', 'column_name') THEN
CREATE INDEX CONCURRENTLY IF NOT EXISTS column_idx ON table_name USING btree (column_name);
END IF; END; $$;

但是有

错误:CREATE INDEX CONCURRENTLY 不能在事务块内运行

如果我只写它就可以了

CREATE INDEX CONCURRENTLY IF NOT EXISTS column_idx ON table_name USING btree (column_name);

如何保留列存在的条件?

飞路4.2.0;

【问题讨论】:

IIRC,你需要使用两个单独的脚本(即CREATE INDEX CONCURRENTLY必须在一个脚本中单独存在,否则Flyway在没有事务的情况下无法运行) 【参考方案1】:

你为什么使用这么旧版本的 flyway ? 你应该先升级你的flyway版本,然后:

为您的脚本创建一个配置文件,例如 V01_001__my_script.sql.conf 其中 V01_001__my_script.sql 是您的 sql 文件的名称。

并将这一行放在里面:

executeInTransaction=false

这将禁用此脚本在事务中的执行。

【讨论】:

有很多旧的遗留代码)当我开始更新版本时,它导致了一连串的错误。明天我会尝试你的建议) 有新问题)Postgres 不能在非事务模式下运行函数和过程

以上是关于Postgres flyway 创建并发索引错误的主要内容,如果未能解决你的问题,请参考以下文章

Flyway 无法找到 postgres docker 的角色

是否可以在 Spring Boot 应用程序中使用脚本创建数据库,并使用 flyway for postgres?如果是的话怎么办?

flyway 后的 Flyway 迁移错误:基线

Flyway - Flyway 架构迁移失败

在 JPA 中使用 Flyway 创建的序列

带有用户名和密码的 Zonky + Spring Boot + Postgres + Flyway