?
Ты SQL знаешь? Про джойны слышал?
Только вкатываюсь в бек, джоины слышал только как опция для получения данных связанной таблицы )
Надо в начале изучить SQL, а только потом приступать к изучению алхимии
Я делаю рекурсивный CTE, который должен быть подзапросом, а потом его аггрегирую в array_agg: select id, (with recursive visual_path (id, title, type, parent_id) as ( select anchor.id as id, anchor.title as title, anchor.type as type, anchor.parent_id as parent_id from "location" as anchor where anchor.id = "location".id union select "recursive".id as recursive_id, "recursive".title as recursive_title, "recursive".type as recursive_type, "recursive".parent_id as recursive_parent_id from "location" as "recursive" join visual_path on visual_path.parent_id = recursive.id ) select array_agg(visual_path) FROM visual_path ) from "location"; И, как видишь, where anchor.id = "location".id должен ссылаться на поле из внешний запроса from "location". Но он на него не ссылается и просто аггрегирует все записи из БД
Когда ты делаешь В запросе select anchor.id as id, anchor.title as title, anchor.type as type, anchor.parent_id as parent_id from "location" as anchor where anchor.id = "location".id "location".id это location из самого запроса, а не самого верхнего. Попробуй алиасы расставить
Ну у меня же CTE идет как подзапрос, верно? Он же обернут скобками
При том, что выражение where anchor.id = "location".id фильтрует по "id" из внешнего запроса
Ну, я не знаю. Попробуй отдельные подзапросы погонять
К примеру, взять cte, заменить = "location".id на конкретный айди из базы и посмотреть, что он выдает. Аналогично, можно поступить и с любым вложенным подзапросом
А, ну так работает как надо
Ну, это что-то очень странное. Мне сложно сказать, в чем тут проблема, посольку я данных не вижу и не особо понимаю, что у тебя там с доменом
Ну вот как я формирую запрос: anchor = aliased(Location, name='anchor') anchor = anchor.query\ .filter(anchor.id == 418)\ .with_entities(anchor.id, anchor.title, anchor.type, anchor.parent_id)\ .cte('visual_path', recursive=True) recursive = aliased(Location, name='recursive') recursive_part = recursive.query\ .with_entities(recursive.id, recursive.title, recursive.type, recursive.parent_id)\ .join(anchor, anchor.c.parent_id == recursive.id) recursive_part = anchor.union(recursive_part) recursive_part = db.session.query( postgresql.array_agg(func.ROW(recursive_part.c.id, recursive_part.c.title), type_=ArrayOfRecord))\ .select_from(recursive_part)\ .subquery() result = Location.query.with_entities(Location.id, recursive_part).all()
Так, а откуда тот запрос? Ты уверен, что то, что формируется в алхимии, и то что ты скинул — это одно и тоже?
Ну последняя переменная recursive_part прям точно формирует тот запрос, что я писал на SQL. Исключение только anchor.id == 418. Вместо 418 я использовал column('id'). Ведь если бы писал anchor.id == Location.id, то было во from было бы не from "location" as anchor, а from "location" as anchor, location. Но в идеале хотелось бы, чтобы этот CTE visual_path был добавлен как атрибут к location. Но в алхимии так нельзя, вроде бы. По-моему в Django ORM можно так делать, точно не помню
Обсуждают сегодня