Postgres GIN索引未通过Liquibase脚本创建

时间:2018-07-25 10:12:50

标签: postgresql indexing liquibase gin

我正在尝试通过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)

1 个答案:

答案 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;

此后跟其他命令应该可以解决问题。