Как указать индекс полнотекстового поиска (MySQL) в миграции Alembic? - PullRequest
0 голосов
/ 21 мая 2018

Я использую Flask-Migrate для проекта, в котором целевая база данных совместима с MySQL Aurora.

Я добавил полнотекстовый индекс в модель, используя Модуль полнотекстового поиска SQLAlchemy Менжуо :

class Post(db.Model, FullText, Serializable):
    __tablename__ = 'post'
    __fulltext_columns__ = ('description', 'text')
    id = db.Column(db.String(10), primary_key=True)
    description = db.Column(db.String(256))
    .
    .
    .

Теперь, когда я использовал Flask-Migrate для генерации миграции, полнотекстовый индекс не был выбран автоматически.Мне хорошо известен тот факт, что Flask-Migrate не подхватывает все , и что вам необходимо вручную добавить несколько вещей в сценарии миграции.

Например, я знаюкак вручную вставить такие строки, как

op.add_column(...)
op.create_unique_constraint(...)
op.create_index(...)

внутри метода upgrade в сгенерированной миграции.Однако, когда я посмотрел документацию create_index для Alembic , я не увидел поддержки создания полнотекстового индекса.Я вижу параметр unique для уникальных индексов, но ничего для полнотекстового индекса.

Итак, я упускаю способ сделать это непосредственно в Alembic (возможно, с помощью команд SQLAlchemy)?Или мне придется написать прямой SQL?Я не хотел бы делать последнее, и я никогда не делал этого раньше.Если это необходимо, как это работает?

1 Ответ

0 голосов
/ 21 мая 2018

Из документации Alembic по create_index() мы находим, что

  • ** кВт - Дополнительные ключевые аргументы, не упомянутые выше, являются диалектомконкретный и передается в виде <dialectname>_<argname>.См. Документацию, касающуюся отдельного диалекта, по адресу Диалекты для получения подробной информации о задокументированных аргументах.

, а затем в документации по диалекту MySQL в разделе "Префиксы индекса" :

Механизмы хранения MySQL позволяют указывать префикс индекса при создании индекса.SQLAlchemy предоставляет эту функцию с помощью параметра mysql_prefix в Index:

Index('my_index', my_table.c.data, mysql_prefix='FULLTEXT')

Учитывая вышесказанное, ваша миграция Alembic должна определять индекс следующим образом:

op.create_index(..., mysql_prefix='FULLTEXT')
...