如何使用SQLAlchemy使用配置创建Postgres GIN索引?

时间:2019-06-29 19:55:16

标签: postgresql sqlalchemy full-text-search alembic

我已经在Postgres表上手动创建了GIN索引,如下所示:

create index idx_ib_keywords on stuff using gin(to_tsvector('english'::regconfig, keywords));

创建良好:

\d stuff
                      Table stuff
   Column   | Type   | Collation | Nullable | Default
------------+--------+-----------+----------+--------
.
.
.
 keywords   | text   |           | not null | 
.
.
.
Indexes:
    .
    .    "idx_ib_keywords" gin (to_tsvector('english'::regconfig, keywords))

现在,我正在使用Alembic进行迁移。当我用alembic自动生成迁移时,不会自动生成GIN索引。不用担心,自动发电机不应该是完美的。因此,我想手动编辑迁移文件。

我已经搜索了如何执行此操作,而我能找到的最接近的内容是this page,然后我写了

op.create_index(op.f('idx_ib_keywords'), 'stuff', ['keywords'], postgresql_using='gin')

进入我的迁移脚本。应用此迁移时,出现错误:

  

sqlalchemy.exc.ProgrammingError:(psycopg2.errors.UndefinedObject)数据类型文本没有访问方法“ gin”的默认运算符类   提示:您必须为索引指定一个运算符类或为数据类型定义一个默认的运算符类。

这是一个很好的错误消息;告诉我我需要做to_tsvector事情。但是,我不知道如何在SQLAlchemy中做到这一点。

是否可以通过简单的方法在SQLAlchemy中编写此代码,还是应该在迁移文件中放入原始SQL?

2 个答案:

答案 0 :(得分:0)

事实证明,附加信息被指定为功能索引,而不是被指定为postgresql_using kwarg的一部分。

正确的SQLAlchemy语句为:

op.create_index(op.f('idx_ib_keywords'),
                'info_block_template',
                [sa.text('to_tsvector(\'english\'::regconfig, keywords)')],
                postgresql_using='gin')

应用此迁移时,新创建的索引将完全按照需要显示:

"idx_ib_keywords" gin (to_tsvector('english'::regconfig, keywords))

答案 1 :(得分:0)

在您的解决方案的帮助下,我可以使用它。可能值得一提的是“ info_block_template”是表名,就像上面的“ stuff”示例中一样。我不确定这是否是一些特殊的语法。

对于btree查询索引也很有效。例如

op.create_index(op.f('ix_index_name'), 'table_name',
            [sa.text('(jsonb_column_name #>> \'{top_level_object,second_level}\')')])