我不能直接将 uuid 与要点索引一起使用
CREATE INDEX idx_leaderboads_values_gist
ON leaderboard_entry
USING gist
(id_leaderboard , value);
我收到了这个错误:
错误:数据类型 uuid 没有访问方法的默认运算符类 “要点”
提示:您必须为索引指定一个运算符类或定义一个 数据类型的默认运算符类。
btree_gist现在还涵盖数据类型
uuid
,就像Paul评论的那样。 (还有一些其他数据类型,尤其是所有 enum
类型。)现在您只需为每个数据库安装一次扩展即可:
CREATE EXTENSION btree_gist;
那么你的索引应该就可以工作了。相关:
Postgres 9.6 或更早版本
a 128-bit quantity
(每个文档),因此最有效的方法是将其转换为两个
bigint
或
float8
以用于索引。但标准 Postgres 中没有定义这些类型转换。我在 pqsql-hackers 列表中发现了一个
stab 朝那个方向,但似乎不成功。
剩下的选项是text
表示上的功能性 GiST 索引:
CREATE INDEX idx_leaderboads_values_gist
ON leaderboard_entry USING gist (id_leaderboard, cast("value" AS text));
要使用此功能索引,查询必须匹配该表达式。您可以在查询中使用简写 "value"::text
(但不能在不添加更多括号的索引定义中使用)。旁白:不要使用
value
作为列名,它是标准 SQL 中的保留字。 问题是:
为什么你需要GiST索引。最佳解决方案取决于目标。
ALTER EXTENSION btree_gist UPDATE;
为了让要点索引与 UUID 一起使用。
Django 遇到此错误消息的人:
UndefinedObject: data type uuid has no default operator class for access method "gist"
HINT: You must specify an operator class for the index or define a default operator class for the data type.
The above exception was the direct cause of the following exception:
ProgrammingError: data type uuid has no default operator class for access method "gist"
HINT: You must specify an operator class for the index or define a default operator class for the data type.
安装扩展(可逆)的最佳方法是编辑迁移文件,这就是您所需要的:
from django.contrib.postgres.operations import BtreeGistExtension
from django.db import migrations
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [BtreeGistExtension()]
在 Django 5.1
上测试。 我知道这个答案比OP正在寻找的内容更具体,但该页面是流行搜索引擎上的第一个结果。