SQL Алхимия CTE Запрос с объектом как результат - PullRequest
0 голосов
/ 30 января 2020

Моя цель - рекурсивно опрашивать всех потомков папки (дети, внуки и т. Д. c и т. Д. c).

class ContentFolder(db.Model):
   __tablename__ = 'content_folder'
   id = db.Column(db.Integer, primary_key=True)
   name = db.Column(db.String(128))
   parent_id = db.Column(db.Integer, db.ForeignKey('content_folder.id'), index=True)

Я смог сделать это для большая часть с:

beginning_getter = db.session.query(ContentFolder).filter(ContentFolder.id==9).cte(name='children_for', recursive=True)
with_recursive = beginning_getter.union_all(
      db.session.query(ContentFolder).filter(ContentFolder.parent_id == beginning_getter.c.id)
   )
descendants = db.session.query(with_recursive).all()

Проблема в том, что эти результаты возвращаются в виде кортежей, а не сопоставленных объектов, как я ожидал.

Я читаю на Группы Google что я мог бы использовать db.session.query(ContentFolder).select_from(with_recursive).all(), но в итоге возвращаются все объекты (включая предков и другие папки, которые не связаны).

Вот правильный вывод SQL, к которому я не могу добраться сопоставление с объектом:

WITH RECURSIVE children_for(id, name, parent_id) AS (
  SELECT
    content_folder.id AS id,
    content_folder.name AS name,
    content_folder.parent_id AS parent_id
  FROM content_folder
  WHERE
    content_folder.id = 9
  UNION ALL
  SELECT
    content_folder.id AS content_folder_id,
    content_folder.name AS content_folder_name,
    content_folder.parent_id AS content_folder_parent_id
  FROM content_folder,
    children_for
  WHERE
    content_folder.parent_id = children_for.id
)
SELECT
  children_for.id AS children_for_id,
  children_for.name AS children_for_name,
  children_for.parent_id AS children_for_parent_id
FROM children_for

А вот что я получаю, когда использую select_from, который возвращает все (обратите внимание на последнюю строку):

WITH RECURSIVE children_for(id, name, parent_id) AS (
  SELECT
    content_folder.id AS id,
    content_folder.name AS name,
  FROM content_folder
  WHERE
    content_folder.id = 9
  UNION ALL
  SELECT
    content_folder.id AS content_folder_id,
    content_folder.name AS content_folder_name,
    content_folder.parent_id AS content_folder_parent_id
  FROM content_folder,
    children_for
  WHERE
    content_folder.parent_id = children_for.id
)
SELECT
  content_folder.id AS content_folder_id,
  content_folder.name AS content_folder_name,
  content_folder.parent_id AS content_folder_parent_id
FROM content_folder,
  children_for

Как я могу получить потомки как объекты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...