Как вывести вложенный json из вложенного CTE в postgresql, используя python? - PullRequest
0 голосов
/ 19 марта 2019

Таблица определена с использованием sqlalchemy core:

categories = Table("categories", metadata,
                   Column("id", Integer, primary_key=True),
                   Column("name", String),
                   Column("parent_id", Integer, 
                          ForeignKey("categories.id"),
                   Column("dept_id", Integer, 
                          ForeignKey("departments.id"),
                          CheckConstraint('id!=parent_id'), 
                          nullable=True),
                   UniqueConstraint('parent_id','name', 
                   name='parent_category'))

Ожидаемое о / п:

{"id": 1,
"parent_id": null,
"name": "root",
"dept_id": null,
   children:[
   {id": 2, "parent_id": 1, "name": "Top_level", "dept_id": null},
   {"id": 3, "parent_id": 1, "name": "Rt_Docs", "dept_id": null}}
   ]
}]

Что я пытался использовать sqlalchemy:

s = text ('с рекурсивным rec_cat в качестве (выберите id, parent_id, name, dept_id, 0 в качестве уровня, массив [id] в качестве path_info из категорий, где parent_id является нулевым объединением, все выберите cat1.id, cat1.parent_id, cat1 .name, cat1.dept_id, level + 1, path_info || cat1.parent_id из rec_cat p объединяет категории cat1 на cat1.parent_id = p.id, где не cat1.id = any (path_info)), dncc as (выберите cat1.parent_id , json_agg (jsonb_build_object (\ 'Name \', cat1.name)) :: jsonb как js из дерева rec_cat объединяет категории cat1, используя (id) где уровень> 0, а не id = любая (path_info) группа по объединению cat1.parent_id all выберите cat1.parent_id, jsonb_build_object (\ 'Name \', cat1.name) || jsonb_build_object (\ 'Sub-cat \', js) в качестве js из категорий соединения дерева dncc cat1 на cat1.id = tree.parent_id) выберите jsonb_agg (js) из dncc, где parent_id равен нулю ')

cat_list = []
mdept_id = None
rs = g.conn.execute(s)
for r in rs:
    mx = collections.OrderedDict(r)
    cat_list.append(mx)
#print cat_list, 'cat_list'
return jsonify({'cat_list': cat_list}), 200

Я получаю вывод, но не в «желаемом» иерархическом вложенном формате. Это дает результат, но после каждого уровня выдает полное дерево с подкатегориями, как в ссылке. Pl. подскажите, какие изменения мне нужно сделать, чтобы получить o / p в формате, который я указывал выше. Я попробовал ссылку: введите описание ссылки здесь

Результат с выше:

cat_list": [
    {
      "jsonb_agg": [
        {
          "Name": "root", 
          "Sub-cat": [
            {
              "Name": "dne-mount"
            }, 
            {
              "Name": "dne-mktg"
            }, 
            {
              "Name": "Marketing"
            }, 
            {
              "Name": "Top_level"
            }, 
            {
              "Name": "Rt_Docs"
            }
          ]
        }, 
        {
          "Name": "root", 
          "Sub-cat": {
            "Name": "Top_level", 
            "Sub-cat": [
              {
                "Name": "Cat1"
              }
            ]

т. не вложенный список

1 Ответ

0 голосов
/ 20 марта 2019

Работает, были ошибки в моем sql:

s = text('with recursive rec_cat as(select id, parent_id, name, dept_id, 0 as level, array[id] as path_info from categories where parent_id is null union all select cat1.id, cat1.parent_id, cat1.name, cat1.dept_id, level + 1, path_info||cat1.parent_id from rec_cat p join categories cat1 on cat1.parent_id=p.id where not cat1.id= any(path_info)), dncc as (select cat1.parent_id, json_agg(jsonb_build_object(\'Name\',cat1.name))::jsonb as js from rec_cat tree join categories cat1 using (id)  where level > 0 and not id=any(path_info) group by cat1.parent_id union all select cat1.parent_id, jsonb_build_object(\'Name\', cat1.name) || jsonb_build_object(\'Subclasses\', js) as js from dncc tree join categories cat1 on cat1.id=tree.parent_id) select jsonb_agg(js) from dncc where parent_id is null')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...