如何在django(1.8)迁移中删除索引varchar_pattern_ops?

时间:2015-09-25 00:36:22

标签: django postgresql migration django-migrations database-indexes

创建带有namedtuple字段的模型时,正在创建models.varchar(...)索引。

这是在postgresql中生成的表

varchar_pattern_ops

我想在迁移中删除该 Table "public.logger_btilog" Column | Type | Modifiers ------------------+--------------------------+----------- md5hash | text | id | integer | not null Indexes: "logger_btilog_pkey" PRIMARY KEY, btree (id) "logger_btilog_md5hash_6454d7bb20588b61_like" btree (md5hash varchar_pattern_ops) 索引,并在该字段中添加哈希索引。

我试过这样做:

varchar_pattern_ops

在迁移中也强制添加# models.py class Btilog(models.Model): md5hash = models.TextField(db_index=False) [...]

db_field=False

运行迁移后,这是数据库中的索引

# 0013_migration.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('logger', '0014_btilog_id'),
    ]

    operations = [
        # this should remove all indexes for md5hash, but it does not work
        migrations.AlterField(
            model_name='btilog',
            name='md5hash',
            field=models.TextField(null=True, blank=True, db_index=False),
        ),
        migrations.RunSQL(
            "create index logger_btilog_md5hash_hashindex on logger_btilog using hash(md5hash);",
            "drop index logger_btilog_md5hash_hashindex;"
        ),
]

请注意 relation | size --------------------------------------------------------------------+--------- public.logger_btilog | 7185 MB public.logger_btilog_md5hash_6454d7bb20588b61_like | 1442 MB public.logger_btilog_md5hash_hashindex | 1024 MB public.logger_btilog_pkey | 548 MB 是我要删除的索引。该索引由django自动添加,请参阅this

有关该指数的更多信息

public.logger_btilog_md5hash_6454d7bb20588b61_like

脚注:我对哈希索引的使用并不感到困惑,我只想在vtfx=# \d logger_btilog_md5hash_6454d7bb20588b61_like Index "public.logger_btilog_md5hash_6454d7bb20588b61_like" Column | Type | Definition ---------+------+------------ md5hash | text | md5hash btree, for table "public.logger_btilog" 字段中进行=(严格平等)where次搜索,然后(随便) md5hash索引最快,占用的空间小于hash索引(django的默认值)

3 个答案:

答案 0 :(得分:8)

  

回复更新通知:

     
      
  • django< 1.11:使用此答案

  •   
  • django> = 1.11:使用@Cesar Canassa的回答

  •   

好的,我在https://docs.djangoproject.com/en/1.8/_modules/django/db/backends/base/schema/#BaseDatabaseSchemaEditor.alter_field

找到了一些信息

并进行了手动CheckDot迁移,以使用RunPython

删除varchar_pattern_ops索引
SchemaEditor

答案 1 :(得分:3)

通过使用Django 1.11中添加的新Model Meta indexes选项,您可以完全避免创建varchar_pattern_ops“LIKE”索引。例如,不要像这样编写模型:

class MyModel(models.Model):
    my_field = models.CharField(max_length=64, db_index=True)

您需要使用Model Meta选项设置索引:

class MyModel(models.Model):
    my_field = models.CharField(max_length=64)

    class Meta:
        indexes = [
            models.Index(fields=['my_field'])
        ]

通过这样做,Django将不会创建重复的索引。

答案 2 :(得分:0)

我正在使用Django 3.0.11 ,但我遇到了同样的问题。我不希望主键使用 _like 索引,因为它仅用于联接和精确匹配。

如果字段是primary_key,则手动定义索引将无济于事。所以我想出了一个与第一个答案类似的hacky解决方案。

linksButtonsDiv.innerHTML = currentHTML + 
`<button type="button" id="${currentLink.rel}">${currentLink.rel}</button>`