Django 1.7 で、マイグレーションファイルでフルテキストインデックスを作成する

(Comments)

Django 1.7 以上の DB マイグレーション機能で、MySQL のフルテキストインデックスを作らせる方法です。

ちなみに、MySQL 5.6 以上は、InnoDB にもフルテキストインデックスが作れます。

はじめに、sqlparse モジュールが必要なので入れておきます。

$ pip install sqlparse

あらかじめ モデルには、フルテキストインデックスを貼るためのテキストフィールドを作っておきます。

class HogeSearch(models.Model):
    ...
    search_text = models.TextField(default='', blank=True)

そして、まずは普通にマイグレーションファイルを作ります。

$ ./manage.py makemigrations hogeapp

その次に、空のマイグレーションファイルを作ります。

$ ./manage.py makemigrations hogeapp --empty

できたマイグレーションファイルを見てみると、operations というリストが作られてますので、その中に migrations.RunSQL インスタンスを入れます。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('hogeapp', '0001_initial'),
    ]

    operations = [
        migrations.RunSQL(
            "CREATE FULLTEXT INDEX i_search_text ON hogeapp_hogemodel (search_text)",
            "DROP INDEX i_search_text ON hogeapp_hogemodel"),
    ]

migrations.RunSQL の第二引数は、リバースマイグレーション用の SQLなので、無くても大丈夫です。 ( ただし、無い場合はリバースマイグレーション (例: ./manage.py migrate hogeapp 0001 ) しようとすると、 Migration.IrreversibleError 例外が出て失敗します。)

出来たマイグレーションを実行すると、フルテキストインデックスが貼られます。

$ ./manage.py migrate hogeapp
Currently unrated

Comments

Recent Tweets

  • 大坂昌彦

    大坂昌彦 @masahiko_osaka

    ytyng

    ついに犯人がわかってしまいました! ナル、一昨日にも僕だったので、昨日の人しかいません!! ペダルにガムテープ貼っても良いけど、剥がして帰って欲しい。散々、自分の足で踏みつけたガムテープを何で次の人が剥がさなきゃならないの??自分… https://t.co/Contz66ZK9
    1 week ago

  • ytyng

    ytyng @ytyng

    Shopify の在庫数更新API GraphQLの場合: 一括更新できる 絶対値更新できない REST API の場合: 一括更新できない 絶対値更新できる なんなのそれ https://t.co/0QyibNQXdt
    3 weeks, 2 days ago

  • ytyng

    ytyng @ytyng

    #bulma スペーシングヘルパー、マージされてる! もうこれBootstrapじゃん https://t.co/uI8fZ6lAOw
    3 weeks, 2 days ago

Recent Posts

Archive

2020
2019
2018
2017
2016
2015
2014
2013
2012
2011

Categories

Authors

Feeds

RSS / Atom