我正试图通过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>