创建带有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的默认值)
答案 0 :(得分:8)
找到了一些信息回复更新通知:
django< 1.11:使用此答案
django> = 1.11:使用@Cesar Canassa的回答
并进行了手动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>`