我正在尝试通过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)
liquibae变更集的每次迁移均失败,但以下情况除外:
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)
答案 0 :(得分:0)
想知道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;
此后跟其他命令应该可以解决问题。