sqlalchemy.ex c .InternalError: (psycopg2.errors.InternalError_) не удалось найти функцию преобразования из неизвестного в description_enum - PullRequest
1 голос
/ 07 марта 2020

Используя SQL, я получаю то, что хочу, с UNION из двух запросов, где первый подзапрос возвращает значение из столбца с псевдонимом-перечислением, а второй подзапрос возвращает NULL для этого столбца с псевдонимом.

SELECT table.enumcol AS description
FROM table
WHERE <expression1>

UNION

SELECT NULL AS description
FROM t
WHERE <expression_2>
;

С помощью SQLAlchemy я могу приблизиться, но не до конца.

q1 = (
    self.dbsession.query(
        Table.enumcol.label("description")
    )
    .filter(<expression_1>)
    .subquery()
)

q2 = (
    self.dbsession.query(
        literal(None).label("description")
    )
    .filter(<expression_2>)
    .subquery()
)

union_list = (
    self.dbsession.query("description")
    .select_entity_from(
        union_all(q1.select(), q2.select())
    )
    .all()
)

Вот сообщение об ошибке:

sqlalchemy.exc.InternalError: (psycopg2.errors.InternalError_) failed to find conversion function from unknown to description_enum

I Понятия не имею, что попытаться решить эту проблему.

Для записи я изначально писал каждый подзапрос отдельно, сначала в SQL, затем в SQLAlchemy, используя .all() вместо .subquery() и union_all(). Мне удалось успешно запустить каждый из них, возвращая правильные результаты.

1 Ответ

0 голосов
/ 08 марта 2020

Благодаря пользователю jjhoo в # sqlalchemy в IR C они дали мне подсказку не использовать .subquery() и использовать .union_all() более эффективно. Вот решение, которое работает для меня.

q1 = (
    self.dbsession.query(
        Table.enumcol.label("description")
    )
    .filter(<expression_1>)
)

q2 = (
    self.dbsession.query(
        literal(None).label("description")
    )
    .filter(<expression_2>)
)

union_list = q1.union_all(q2).all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...