Postgres GIN索引不是通过Liquibase脚本创建的



我正试图通过liquibase脚本创建一个GIN索引。

CREATE INDEX IF NOT EXISTS index_name ON schema_name.table_name USING gin (column1, lower(column2) COLLATE pg_catalog."default" gin_trgm_ops)

每次liquibai变更集的迁移都会失败,出现以下异常:

liquibase.exception.DatabaseException:错误:访问方法"gin"的运算符类"gin_trgm_ops"不存在

问题是,当直接从pgAdmin查询工具运行时,此查询有效。从liquibase脚本运行此查询时似乎出现了一些问题。

在从pgAdmin查询工具创建索引之前,我必须创建以下扩展。我也在liquibase脚本中创建这些扩展。

CREATE EXTENSION IF NOT EXISTS pg_trgm with schema public;
CREATE EXTENSION IF NOT EXISTS btree_gin with schema public;

以下是我的liquibase脚本中创建扩展和索引的部分Btree创建索引的查询与liquibase脚本配合良好。当尝试创建GIN索引时,它会失败,并出现上述异常。

CREATE EXTENSION IF NOT EXISTS pg_trgm with schema public;
CREATE EXTENSION IF NOT EXISTS btree_gin with schema public;

以下工作:

CREATE INDEX IF NOT EXISTS index_name ON table_name USING btree (col1,col2 COLLATE pg_catalog."default") 
CREATE INDEX IF NOT EXISTS index_name ON table_name USING btree (col1, col2 COLLATE pg_catalog."default")

但这失败了:

CREATE INDEX IF NOT EXISTS index_name ON table_name USING gin (col1, lower(col2) COLLATE pg_catalog."default" gin_trgm_ops)

想知道liquibase是否正在运行脚本,是否没有在搜索路径中使用公共架构运行,导致无法找到用于创建索引的gin_trgm_ops运算符类。错误消息肯定会表明这一点。

显式地将其添加到搜索路径并重试(应该可以(,或者在pg_catalog模式中创建扩展,使其隐式可用。请参见此处:https://www.postgresql.org/docs/9.1/ddl-schemas.html(第5.7.5节(

您可以通过运行以下命令来代替现有的pg_trgm create extension命令来实现这一点。

CREATE EXTENSION IF NOT EXISTS pg_trgm with schema pg_catalog;

接下来是你的其他命令就可以了。

以下对我有效,而不是在changeSet中使用createIndex语句我使用了像这样的自定义sql语句

<changeSet author="me" id="26">
<sql>CREATE INDEX my_table_hours_idx ON my_table USING GIN(hours)</sql>
</changeSet>

相关内容

  • 没有找到相关文章

最新更新