索引¶
默认情况下,tortoise 在字段中定义索引时使用 BTree 索引,使用 db_index=True,或在 Meta 类中定义索引,但如果你想使用其他索引类型,比如 MySQL 中的 FullTextIndex 或 Postgres 中的 GinIndex,你应该使用 tortoise.indexes.Index 及其子类。
用法¶
以下是使用 MySQL 的 FullTextIndex 和 SpatialIndex 的示例
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.indexes 和 tortoise.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"