【问题标题】:How to specify a full text search index (MySQL) in an Alembic migration?如何在 Alembic 迁移中指定全文搜索索引 (MySQL)?
【发布时间】:2018-10-30 13:16:29
【问题描述】:

我将 Flask-Migrate 用于目标数据库是 MySQL 兼容的 Aurora 的项目。

我使用Menzhuo's SQLAlchemy fulltext search module为模型添加了全文索引:

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 documentation for Alembic 时,我没有看到任何对创建全文索引的支持。我看到了唯一索引的 unique 参数,但没有看到全文索引。

所以我是否错过了直接在 Alembic 中执行此操作的方法(可能使用 SQLAlchemy 命令)?还是我必须编写直接的 SQL?我讨厌不得不做后者,而且我以前从未这样做过。如果有必要,它是如何工作的?

【问题讨论】:

    标签: python sqlalchemy alembic flask-migrate sqlalchemy-migrate


    【解决方案1】:

    create_index() 上的 Alembic 文档中我们发现

    • **kw – 上面未提及的其他关键字参数是特定方言的,并以<dialectname>_<argname> 的形式传递。请参阅Dialects 上有关个别方言的文档,以获取有关文档论证的详细信息。

    然后在"Index Prefixes"下的MySQL方言文档中:

    MySQL 存储引擎允许您在创建索引时指定索引前缀。 SQLAlchemy 通过Index 上的mysql_prefix 参数提供此功能:

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

    鉴于上述情况,您的 Alembic 迁移应该像这样定义索引:

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

    【讨论】:

    • 干得好!我没有注意到如何将 FULLTEXT 连接到特定方言的 kwarg。这非常有效。
    • 注意:1.1.5 版中的新功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2012-05-09
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多