Запрос столбца JSON в логическом поле - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть 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))

1 Ответ

0 голосов
/ 08 ноября 2019

Ну, оказывается, это ошибка / особенность в sqlite3. Смотри: https://github.com/sqlalchemy/sqlalchemy/issues/4969

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...