/ / Як створити GIN-індекс у міграції Джанго - django, postgresql, індексація, міграція, джанго-міграції

Як створити індекс GIN в міграції Джанго - django, postgresql, індексація, міграція, django-міграції

У Django, починаючи з версії 1.11, ми маємо клас для PostgreSQL GinIndex (https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/) Я хочу створити міграцію, яка конструює такий індекс на a VectorSearchField Я додав до одного з моїх таблиць. До цих пір я спробував просто додати db_index=True до VectorSearchField, але це не вдається, тому що він намагається створити індекс B-Tree (я думаю) і VectorSearchField значення занадто довгі.

Мені вдалося створити індекс, який я хочу, запустивши a migrations.RunSQL() міграція з:

CREATE INDEX entryline_sv_index ON entryline USING GIN (sv);

Однак, я здогадуюсь, оскільки є особливий GinIndex клас в Django, можливо, є спосіб створити такий індекс без виконання сирого 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 ... запитати найкраще?

Відповіді:

10 за відповідь № 1

У 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 більше не потрібні