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
Comments