Skip to content

错误

本页列出了 Redis OM 在使用过程中可能产生的错误,并提供了更多的错误上下文信息。

E1

为了对列表字段进行查询,您必须使用类型注解定义列表的内容,例如:orders: List[Order]。

如果您尝试在不是列表的字段上使用 "IN" 查询,例如 await TarotWitch.find(TarotWitch.tarot_cards << "death").all(),您将看到此错误。

在这个例子中,TarotWitch.tarot_cards 是一个列表,因此查询有效:

from typing import List

from redis_om import JsonModel, Field

class TarotWitch(JsonModel):
    tarot_cards: List[str] = Field(index=True)

但如果 tarot_cards 不是列表,尝试使用 << 查询将导致此错误。

E2

您尝试按 {field_name} 排序,但 {self.model} 并未将该字段定义为可排序。

您尝试按一个不可排序的字段对查询结果进行排序。以下是如何将字段标记为可排序:

from typing import List

from redis_om import JsonModel, Field

class Member(JsonModel):
    age: int = Field(index=True, sortable=True)

注意: 只有已索引字段才能是可排序的。

E3

您尝试在字段 '{field.name}' 上进行全文搜索,但该字段未被索引以进行全文搜索。请使用 full_text_search=True 选项。

您可以使用模块 (%) 运算符进行全文搜索。这样的查询看起来像这样:

from redis_om import JsonModel, Field

class Member(JsonModel):
    bio: str = Field(index=True, full_text_search=True, default="")

Member.find(Member.bio % "beaches").all()

如果您看到此错误,意味着您查询的字段(示例中的 bio)未被索引以进行全文搜索。确保同时将字段标记为 index=Truefull_text_search=True,如示例所示。

E4

仅支持列表和元组作为多值字段。

这意味着您将一个字段标记为 index=True,但该字段不是 Redis OM 实际可以索引的类型。

具体而言,您可能使用了下标注释,例如 Dict[str, str]。Redis OM 只能索引的下标类型是 ListTuple

E5

仅支持等于 (=)、不等于 (!=) 和 like() 比较用于 TEXT 字段。

您正在查询一个您标记为全文搜索的已索引字段。您只能使用相等(==)、不相等(!=)和 like (%) 运算符查询这些字段。

from redis_om import JsonModel, Field

class Member(JsonModel):
    bio: str = Field(index=True, full_text_search=True, default="")

# 等于
Member.find(Member.bio == "Programmer").all()

# 不等于
Member.find(Member.bio != "Programmer").all()

# Like(全文搜索)。这将 "programming"
# 词干提取,以找到任何匹配的相同词干的术语,
# "program"。
Member.find(Member.bio % "programming").all()

E6

您尝试查询一个未被索引的字段 ({field_name})。

您编写了一个查询,使用了一个未被标记为索引的模型字段。您只能查询已索引的字段。以下示例代码将生成此错误:

from redis_om import JsonModel, Field

class Member(JsonModel):
    first_name: str 
    bio: str = Field(index=True, full_text_search=True, default="")

# 因为我们没有将 `first_name` 标记为索引,
# 所以引发了 QueryNotSupportedError!
Member.find(Member.first_name == "Andrew").all()

通过将字段标记为索引来修复此问题:

from redis_om import JsonModel, Field

class Member(JsonModel):
    first_name: str = Field(index=True)
    bio: str = Field(index=True, full_text_search=True, default="")

# 因为我们没有将 `first_name` 标记为索引,
# 所以引发了 QueryNotSupportedError!
Member.find(Member.first_name == "Andrew").all()

E7

查询表达式应以字段或括号内的表达式开头。

我们在尝试解析您的查询表达式时感到困惑。这不是您的问题,是我们的!一些代码示例可能会有所帮助……

from redis_om import JsonModel, Field

class Member(JsonModel):
    first_name: str = Field(index=True)
    last_name: str = Field(index=True)

# 只有一个运算符的查询通常很简单:
Member.find(Member.first_name == "Andrew").all()

# 如果您想添加多个条件,可以将它们用 AND 结合在一起,
# 通过将条件一个接一个地作为参数包含。
Member.find(Member.first_name=="Andrew",
            Member.last_name=="Brookins").all()

# 或者,您可以用括号分隔条件,并使用显式的 AND。
Member.find(
    (Member.first_name == "Andrew") & ~(Member.last_name == "Brookins")
).all()

# 您不能使用 `!` 表示 NOT。相反,请使用 `~`。
Member.find(
    (Member.first_name == "Andrew") & 
    ~(Member.last_name == "Brookins")  # <- 请注意,这个现在是 NOT!
).all()

# 括号是构建更复杂查询的关键,
# 像这样。
Member.find(
    ~(Member.first_name == "Andrew")
    & ((Member.last_name == "Brookins") | (Member.last_name == "Smith"))
).all()

# 如果您对 Redis OM 如何解释查询感到困惑,
# 可以使用 `tree()` 方法可视化 `FindQuery` 的表达式树。
query = Member.find(
    ~(Member.first_name == "Andrew")
    & ((Member.last_name == "Brookins") | (Member.last_name == "Smith"))
)
print(query.expression.tree)
"""
           ┌first_name
    ┌NOT EQ┤
    |      └Andrew
 AND┤
    |     ┌last_name
    |  ┌EQ┤
    |  |  └Brookins
    └OR┤
       |  ┌last_name
       └EQ┤
          └Smith
"""

E8

您只能用 AND (&) 或 OR (|) 组合两个查询表达式。

您可以在查询中组合表达式的唯一两个运算符是 &|。您可能意外使用了其他运算符,或者 Redis OM 可能感到困惑。确保您使用括号来组织查询表达式。

如果您试图使用 "NOT",可以通过在查询前加上 ~ 运算符来实现,例如:

from redis_om import JsonModel, Field

class Member(JsonModel):
    first_name: str = Field(index=True)
    last_name: str = Field(index=True)

# 查找不叫 Andrew 的人。
Member.find(~(Member.first_name == "Andrew")).all()

请注意,这种形式要求在您要 "否定" 的表达式周围加上括号。当然,这个例子用 != 也更合适:

from redis_om import JsonModel, Field

class Member(JsonModel):
    first_name: str = Field(index=True)
    last_name: str = Field(index=True)

# 查找不叫 Andrew 的人。
Member.find(Member.first_name != "Andrew").all()

不过,~ 在否定括号包围的表达式组时非常有用。