索引

默认情况下,tortoise 在字段中定义索引时使用 BTree 索引,使用 db_index=True,或在 Meta 类中定义索引,但如果你想使用其他索引类型,比如 MySQL 中的 FullTextIndexPostgres 中的 GinIndex,你应该使用 tortoise.indexes.Index 及其子类。

用法

以下是使用 MySQLFullTextIndexSpatialIndex 的示例

from tortoise import Model, fields
from tortoise.contrib.mysql.fields import GeometryField
from tortoise.contrib.mysql.indexes import FullTextIndex, SpatialIndex


class Index(Model):
    full_text = fields.TextField()
    geometry = GeometryField()

    class Meta:
        indexes = [
            FullTextIndex(fields={"full_text"}, parser_name="ngram"),
            SpatialIndex(fields={"geometry"}),
        ]

可以在 tortoise.contrib.mysql.indexestortoise.contrib.postgres.indexes 中找到一些内置索引。

扩展索引

扩展索引很简单,你只需要继承 tortoise.indexes.Index,以下是如何创建 FullTextIndex 的示例

from typing import Optional, Set
from pypika.terms import Term
from tortoise.indexes import Index

class FullTextIndex(Index):
    INDEX_TYPE = "FULLTEXT"

    def __init__(
        self,
        *expressions: Term,
        fields: Optional[Set[str]] = None,
        name: Optional[str] = None,
        parser_name: Optional[str] = None,
    ):
        super().__init__(*expressions, fields=fields, name=name)
        if parser_name:
            self.extra = f" WITH PARSER {parser_name}"

对于 Postgres,你应该继承 tortoise.contrib.postgres.indexes.PostgresIndex

class BloomIndex(PostgreSQLIndex):
    INDEX_TYPE = "BLOOM"