Create a Full-Text Index in Migration Files with Django 1.7

Django
2015-09-03 20:48 (9 years ago) ytyng

This is a method to create a full-text index in MySQL using the DB migration feature in Django 1.7 and above.

By the way, MySQL 5.6 and above allows you to create full-text indexes in InnoDB as well.

First, you need to install the sqlparse module.

$ pip install sqlparse

In advance, create a text field in your model for applying the full-text index.

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

Then, generate a normal migration file first.

$ ./manage.py makemigrations hogeapp

Next, create an empty migration file.

$ ./manage.py makemigrations hogeapp --empty

When you look at the created migration file, you will see a list called operations. Insert a migrations.RunSQL instance into this list.

# -*- 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"),
    ]

The second argument of migrations.RunSQL is SQL for reverse migration, so it is not mandatory. (However, if it is not provided, attempting reverse migration (e.g., ./manage.py migrate hogeapp 0001) will cause a Migration.IrreversibleError exception and fail.)

When you execute the created migration, the full-text index will be applied.

$ ./manage.py migrate hogeapp
Currently unrated

Comments

Archive

2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011