【发布时间】: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