У меня есть Food
модель со столбцом JSON. Я использую 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))