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

Posted

技术标签:

【中文标题】如何在 Django 迁移中创建 GIN 索引【英文标题】:How to create GIN index in Django migration 【发布时间】:2017-10-03 06:55:42 【问题描述】:

在 Django 中,从 1.11 版开始,我们有一个用于 PostgreSQL 的类 GinIndex (https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/)。我想创建一个迁移,在我添加到我的一个表中的VectorSearchField 上构建这样的索引。到目前为止,我尝试简单地将db_index=True 添加到VectorSearchField,但是失败了,因为它试图创建一个B-Tree 索引(我认为)并且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】:

还没有机会将我的旧手册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 语句。

【讨论】:

这正是我想要的! :) 只是不知道使用 GinIndex 类的正确方法。谢谢! 很高兴我能帮上忙。祝您的项目一切顺利

以上是关于如何在 Django 迁移中创建 GIN 索引的主要内容,如果未能解决你的问题,请参考以下文章

python 如何在Django迁移文件中创建一个函数

django多数据库迁移:如何防止在每个数据库中创建django默认表

如何在Laravel中创建唯一索引?

如何在 Django 中创建不区分大小写的数据库索引?

如何在 Oracle 12c 中创建带条件的索引?

如何在托管 = False 的 Django 测试期间创建表?