Запись данных с бесконечной вложенностью в MySQL. Python

130
22 апреля 2022, 21:10

Делаю скрипт для записи данных в таблицу, бд MySQL. К полям, которые есть в тестовых данных я добавил поле "parent_id" для записи id родителя. Поле "children" в тестовых данных имеет бесконечную вложенность. Данные такого вида:

[
  {
    "id": 1,
    "name": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438",
    "alias": "users",
    "children": [
      {
        "id": 2,
        "name": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435",
        "alias": "create"
      },
      {
        "id": 3,
        "name": "\u0421\u043f\u0438\u0441\u043e\u043a",
        "alias": "list",
        "children": [
          {
            "id": 4,
            "name": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435",
            "alias": "active"
          },
          {
            "id": 5,
            "name": "\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435",
            "alias": "deleted"
          }
        ]
      },
      {
        "id": 8,
        "name": "\u041f\u043e\u0438\u0441\u043a",
        "alias": "search"
      }
    ]
  }
]

Код функции для записи в существующую таблицу. Obj - массив с данными.

def func(obj):
    # проходим циклом по списку данных
    for i, item in enumerate(obj):
        if "children" in item:
            global parent_id
            parent_id = obj[i]["id"]
            print(parent_id)
            cur.execute("INSERT IGNORE INTO menu (id, name, alias, parent_id) VALUES (%s, %s, %s, %s)", (item["id"], item["name"], item["alias"], parent_id))
            func(item["children"])
        else:
            cur.execute("INSERT IGNORE INTO menu (id, name, alias, parent_id) VALUES (%s, %s, %s, %s)", (item["id"], item["name"], item["alias"], parent_id))

Проблема с записью в поле "parent_id". Если это ребёнок - нужно записать id родителя. В "parent_id" объекта с id-8, записывается родитель id-3, хотя родитель у него id-1. Я думаю, что это из-за преждевременного запуска рекурсии в теле функции. Как сделать так, чтобы всё работало я пока не знаю. Буду рад любой помощи.

UPDATE

CREATE TABLE IF NOT EXISTS menu ( id INT PRIMARY KEY, 
                                  name VARCHAR(200), 
                                  alias VARCHAR(200), 
                                  parent_id INT DEFAULT 0 );
READ ALSO
Incorrect file format 'user'

Incorrect file format 'user'

Я установил БД на RPI Но когда я пытаюсь создать нового юзера

97
C++ input / output (getchar)

C++ input / output (getchar)

отрывок из main()

226
Как поставить библиотеку в С++?

Как поставить библиотеку в С++?

Я пришёл с питона несколько дней назад, и для своих задач я использовал только opencvИ вот тут я захотел попробовать C++ и как бы смешно не было,...

291