sqlalchemy: переопределить автоматическое создание предложения из select

#python #sql #sqlalchemy

#python #sql #sqlalchemy

Вопрос:

Если у меня есть в sqlalchemy:

 select([foo.c.id]).select.where(foo.c.id == bar.c.val).select_from(foo)
  

Я получаю SQL, который выглядит как:

 SELECT foo.id
FROM foo, bar
WHERE foo.id = bar.val
  

Чего я хочу, так это:

 SELECT foo.id
FROM foo
WHERE foo.id = bar.val
  

Я понимаю, что само по себе это не имеет смысла, но я компилирую выражение и вкладываю его в предложение exists инструкции delete в таблице, bar поэтому bar.val имеет смысл в контексте — полная инструкция будет выглядеть примерно так:

 DELETE FROM bar WHERE EXISTS (
  SELECT foo.id
  FROM foo
  WHERE foo.id = bar.val
)
  

Как я могу отключить автоматическое FROM создание предложения в SQL alchemy?

Ответ №1:

В вашем случае вам не нужно его отключать. Просто создайте полный delete оператор и sqlalchemy разберетесь:

 from sqlalchemy.sql.expression import exists
q2 = bar.delete().where(exists(q1))
print(q2)
  

создает:

 DELETE FROM bar WHERE EXISTS (SELECT foo.id
FROM foo
WHERE foo.id = bar.id)