如何在Django迁移中创建GIN索引

时间:2017-05-04 22:57:46

标签: django postgresql indexing migration django-migrations

在Django中,从版本1.11开始,我们有一个PostgreSQL GinIndexhttps://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/)的类。我想在我添加到其中一个表的VectorSearchField上创建一个构建此类索引的迁移。到目前为止,我已经尝试简单地将db_index=True添加到VectorSearchField,但这失败了,因为它尝试创建B树索引(我认为)和VectorSearchField价值太长了。

我设法通过运行migrations.RunSQL()迁移来创建我想要的索引:

CREATE INDEX entryline_sv_index ON entryline USING GIN (sv);

但是,我猜,因为Django中有一个特殊的GinIndex类,也许有一种方法可以在不执行原始SQL的情况下创建这样的索引?

这是一个模型类:

import django.contrib.postgres.search as pg_search

class EntryLine(models.Model):
    speaker = models.CharField(max_length=512, db_index=True)
    text = models.TextField()
    sv = pg_search.SearchVectorField(null=True)  # I want a GIN index on this field.

知道如何在迁移中为sv字段正确创建索引吗?或者是以最佳方式执行CREATE INDEX ...查询?

1 个答案:

答案 0 :(得分:16)

Haven还没有机会将我的旧手动CREATE INDEX代码迁移到1.11中引入的新系统,但我的理解是

from django.contrib.postgres.indexes import GinIndex
import django.contrib.postgres.search as pg_search

class EntryLine(models.Model):
    speaker = models.CharField(max_length=512, db_index=True)
    text = models.TextField()
    sv = pg_search.SearchVectorField(null=True) 
    class Meta:
        indexes = [GinIndex(fields=['sv'])]

需要什么。不再需要使用原始SQL CREATE INDEX语句