Как создать индекс Postgres GIN с помощью конфигурации с использованием SQLAlchemy? - PullRequest
1 голос
/ 29 июня 2019

Я вручную создал индекс GIN для таблицы Postgres следующим образом:

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 НЕ генерируется автоматически.Не беспокойтесь, автоматический генератор не должен быть идеальным.Поэтому я хочу пойти и отредактировать файл миграции вручную.

Я искал, как это сделать, и самое близкое, что я мог найти, было эта страница , за которой я следовал, инаписал

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 в файле миграции?

1 Ответ

0 голосов
/ 29 июня 2019

Оказывается, что дополнительная информация указывается как функциональный индекс, , а не как часть 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...