【问题标题】:Querying a JSON column on a boolean field在布尔字段上查询 JSON 列
【发布时间】:2020-03-04 04:42:41
【问题描述】:

我有一个带有 JSON 列的 Food 模型。我使用 sqlite3。

class Food(Base):

    __tablename__ = "foods"
    properties = Column(JSON)

在这个 JSON properties 字段中,我可以有几种类型的字段:字符串、整数和布尔值。

如果我想查询 properties 的字符串 json 字段:

from sqlalchemy import type_coerce
from sqlalchemy.dialects.sqlite import JSON

tastes_ok = ["yummy", "beurk"]
coerced_values = [type_coerce(v, JSON) for v in tastes_ok]

foods = session.query(Food).filter(Food.properties["taste"].in_(coerced_values))

或者对于一个包含整数的json字段:

number_of_eggs = [1, 2, 3]
coerced_values = [type_coerce(v, JSON) for v in number_of_eggs]

foods = session.query(Food).filter(Food.properties["number_of_eggs"].in_(coerced_values))

但这种方法不适用于布尔值:

is_it_good = [True, False]
# is_it_good = [True]  # doesn't work either
coerced_values = [type_coerce(v, JSON) for v is_it_good]

foods = session.query(Food).filter(Food.properties["is_it_good"].in_(coerced_values))

但是,这是可行的:

foods = session.query(Food).filter(Food.properties["is_it_good"] == cast(True, JSON))

但这不是:

foods = session.query(Food).filter(Food.properties["is_it_good"].in_([cast(True, JSON)])

有没有办法让这个查询对布尔值起作用?最好使用in_ 比较,最好使用type_coerce 方法。最终目标是拥有一个通用接口,我只需传递一个 json 字段名称和可能的值。

编辑:

这一切都归结为:

# This doesn't work
foods = session.query(Food).filter(Food.properties["is_it_good"].in_(type_coerce(True, JSON))

# This works
foods = session.query(Food).filter(Food.properties["is_it_good"].in_(type_coerce(1, JSON))

【问题讨论】:

    标签: python json sqlalchemy


    【解决方案1】:

    好吧,原来这是 sqlite3 的一个错误/功能。见:https://github.com/sqlalchemy/sqlalchemy/issues/4969

    【讨论】:

      猜你喜欢
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      相关资源
      最近更新 更多