---
slug: "Django1.7で、マイグレーションファイルでフルテキストインデックスを作成する"
title: "Django 1.7 で、マイグレーションファイルでフルテキストインデックスを作成する"
description: "\n\n\nDjango 1.7 以上の DB マイグレーション機能で、MySQL のフルテキストインデックスを作らせる方法です。"
url: "https://www.ytyng.com/blog/Django1.7で、マイグレーションファイルでフルテキストインデックスを作成する"
publish_date: "2015-09-03T11:48:31Z"
created: "2015-09-03T11:48:31Z"
updated: "2026-02-27T10:43:00.486Z"
categories: ["Django"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/0794c321efb2452d9a07585ebe0c707c.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

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

<div class="document">


<p>Django 1.7 以上の DB マイグレーション機能で、MySQL のフルテキストインデックスを作らせる方法です。</p>
<p>ちなみに、MySQL 5.6 以上は、InnoDB にもフルテキストインデックスが作れます。</p>
<p>はじめに、sqlparse モジュールが必要なので入れておきます。</p>
<pre class="literal-block">$ pip install sqlparse
</pre>
<p>あらかじめ モデルには、フルテキストインデックスを貼るためのテキストフィールドを作っておきます。</p>
<pre class="literal-block">class HogeSearch(models.Model):
    ...
    search_text = models.TextField(default='', blank=True)
</pre>
<p>そして、まずは普通にマイグレーションファイルを作ります。</p>
<pre class="literal-block">$ ./manage.py makemigrations hogeapp
</pre>
<p>その次に、空のマイグレーションファイルを作ります。</p>
<pre class="literal-block">$ ./manage.py makemigrations hogeapp --empty
</pre>
<p>できたマイグレーションファイルを見てみると、operations というリストが作られてますので、その中に migrations.RunSQL インスタンスを入れます。</p>
<pre class="literal-block"># -*- 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"),
    ]
</pre>
<p>migrations.RunSQL の第二引数は、リバースマイグレーション用の SQLなので、無くても大丈夫です。
( ただし、無い場合はリバースマイグレーション (例: ./manage.py migrate hogeapp 0001 ) しようとすると、
Migration.IrreversibleError 例外が出て失敗します。)</p>
<p>出来たマイグレーションを実行すると、フルテキストインデックスが貼られます。</p>
<pre class="literal-block">$ ./manage.py migrate hogeapp
</pre>
</div>
