Как решить ошибку «Оператор ‘getitem’ не поддерживается в этом выражении» при использовании case ()

#python #mysql #sqlalchemy

#python #mysql #sqlalchemy

Вопрос:

Я пытаюсь преобразовать следующий SQL в SQLAlchemy:

 select t1.id, t1.field_A,
    max(case when t2.field_B = 1 then t2.field_C end) test_2_field_b_1,
    max(case when t2.field_B = 2 then t2.field_C end) test_2_field_b_2
from test_1 t1
inner join test_2 t2 on t2.field_A = t1.field_A
group by t1.id, t1.field_A
  

Я получил, насколько:

 qry = session.query(
    Test1.id_,
    Test2.field_A,
    func.max(case((Test2.field_B.__eq__(1), "Test2.field_C"))).label("test_2_field_b_1"),
    func.max(case((Test2.field_B.__eq__(2), "Test2.field_C"))).label("test_2_field_b_2"),
)
qry = qry.select_from(Test1)
qry = qry.join(Test2, Test2.field_A.__eq__(Test1.field_A))
qry = qry.group_by(Test1.id_, Test2.field_A)
  

Но я получаю следующую ошибку:

 NotImplementedError: Operator 'getitem' is not supported on this expression
  

В строке:

 func.max(case((Test2.field_B.__eq__(1), "Test2.field_C"))).label("test_2_field_b_1"),
  

ТАК что не позволит мне опубликовать всю обратную трассировку, поскольку в ней говорится, что слишком много кода!

Где я ошибаюсь?

Ответ №1:

case принимает список when критериев в качестве первого аргумента, поэтому вам нужно заключить его в соответствующие скобки:

 sa.case([(Model.column == value, then_output)])
  

Итак, ваш код должен выглядеть следующим образом:

 qry = session.query(
    Test1.id_,
    Test2.field_A,
    sa.func.max(sa.case([(Test2.field_B == 1, "Test2.field_C")])).label("test_2_field_b_1"),
    sa.func.max(sa.case([(Test2.field_B == 2, "Test2.field_C")])).label("test_2_field_b_2"),
)
qry = qry.select_from(Test1)
qry = qry.join(Test2, Test2.field_A == Test1.field_A)

  

Комментарии:

1. Потрясающее спасибо!! В примере с сайта SQLAlchemy он ссылается на необходимый список, но на самом деле его не показывает: docs.sqlalchemy.org/en/14/core /. … Примечание для самостоятельного чтения в следующий раз!