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?如果是的话怎么办?