Моя цель - рекурсивно опрашивать всех потомков папки (дети, внуки и т. Д. 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
Как я могу получить потомки как объекты?