#python #postgresql #sqlalchemy
Вопрос:
Я пытаюсь использовать sqlalchemy для создания запроса (для postgres), который выглядит следующим образом:
INSERT INTO table1 (a, b, c)
SELECT a, b, c FROM (
VALUES
(1, 2, 3),
(4, 5, 6),
) AS x (a, b, c)
WHERE EXISTS (
SELECT 1 FROM table2 t
WHERE t.id = x.a
)
Я могу с радостью создать предложение VALUES в середине, как:
sel = select(Values(column(a, BigInteger), column(b, BigInteger), column(c, BigInteger), name='x').data([(1, 2, 3), (4, 5, 6)]))
И я могу сделать предложение EXISTS следующим образом:
ex = session.query(Table2).filter(Table2.id == sel.c.a)
Но когда я распечатываю результирующий SQL из комбинации двух операторов, повторяется все предложение SELECT со значениями:
>>> str(sel)
'SELECT x.a, x.b, x.c FROM (VALUES (:param_1, :param_2, :param_3), (:param_4, :param_5, :param_6)) AS x (a, b, c)'
>>> str(ex)
'EXISTS (SELECT 1 FROM table2, (SELECT x.a AS a, x.b AS b, x.c AS c FROM (VALUES (:param_1, :param_2, :param_3), (:param_4, :param_5, :param_6)) AS x (a, b, c)) AS x WHERE table2.id = x.a)'
>>> str(sel.where(ex))
'SELECT x.a, x.b, x.c FROM (VALUES (:param_1, :param_2, :param_3), (:param_4, :param_5, :param_6)) AS x (a, b, c) WHERE EXISTS (SELECT 1 FROM table2, (SELECT x.a AS a, x.b AS b, x.c AS c FROM (VALUES (:param_7, :param_8, :param_9), (:param_10, :param_11, :param_12)) AS x (a, b, c)) AS x nWHERE table2.id = x.a)'
Может ли кто-нибудь пролить свет на то, как я могу достичь того, что я пытаюсь сделать? Заранее спасибо за помощь!
Комментарии:
1. Вы используете инструмент (программное обеспечение с заранее определенным алгоритмом) для создания своего запроса. Вас не должно волновать, что это за запрос, при условии, что он соответствует 2 требованиям. 1 — Он выдает правильный ответ и 2 — он удовлетворяет вашему соглашению об уровне обслуживания (т. е. он достаточно быстр). Если это не сработает ни в одном из них, возможно, вы задаете неправильный вопрос. Если вы хотите контролировать структуру запроса, то напишите его, а не создавайте.