Многоуровневый JSON Данные в SQL Использование Python - PullRequest
0 голосов
/ 03 мая 2020

Я работаю над тем, чтобы взять JSON данные и выгрузить их в SQL базу данных. Я наткнулся на некоторые данные, которые являются «многоуровневыми», и я застрял в поиске наилучшего подхода к обработке данных и созданию правильной структуры таблицы в SQL.

Вот часть JSON данные, которые имеют многоуровневую структуру:

"LimitedTaxonomy": {
            "Children": [
                {
                    "Children": [
                        {
                            "Children": [],
                            "NewPartCount": 0,
                            "Parameter": "Categories",
                            "ParameterId": -8,
                            "PartCount": 1,
                            "Value": "Logic - Flip Flops",
                            "ValueId": "706"
                        }
                    ],
                    "NewPartCount": 0,
                    "Parameter": "Categories",
                    "ParameterId": -8,
                    "PartCount": 1,
                    "Value": "Integrated Circuits (ICs)",
                    "ValueId": "32"
                }
            ],
            "NewPartCount": 0,
            "Parameter": "Categories",
            "ParameterId": -8,
            "PartCount": 1,
            "Value": "Out of Bounds",
            "ValueId": "0"
        }

У меня есть функция, которую я вызываю, когда анализирую данные JSON, которые принимают структуру и помещают данные в таблицы SQL. Используя данные JSON, приведенные выше, я передам:

thetable = 'LimitedTaxonomy'
the value = {'Children': [{'Children': [{'Children': [], 'NewPartCount': 0, 'Parameter': 'Categories', 'ParameterId': -8, 'PartCount': 1, 'Value': 'Logic - Flip Flops', 'ValueId': '706'}], 'NewPartCount': 0, 'Parameter': 'Categories', 'ParameterId': -8, 'PartCount': 1, 'Value': 'Integrated Circuits (ICs)', 'ValueId': '32'}], 'NewPartCount': 0, 'Parameter': 'Categories', 'ParameterId': -8, 'PartCount': 1, 'Value': 'Out of Bounds', 'ValueId': '0'}
def create_sql(thetable, thevalue):
    if len(thevalue) > 0:
        #print(thevalue[0], len(thevalue))
        if type(thevalue) is list:
            x = tuple(thevalue[0])
        elif type(thevalue) is dict:
            x = tuple(thevalue)

        a = str(x).replace("'","").replace("(","")

        query = "INSERT INTO " + thetable + " (PartDetailsId, " + a + " VALUES(" + str(data['PartDetails']['PartId'])

        b = ""
        for i in range(len(x)):
            b += ", ?" # I've also seen %s used as a placeholder
        b += ")"
        query += b

        print(query)
        print(thevalue)
        print()

        #TODO Need to check before entering data, list has many records, dict has 1
        if type(thevalue) is list:
            cursor.executemany(query, [tuple(d.values()) for d in thevalue])
        elif type(thevalue) is dict:
            cursor.execute(query, tuple(thevalue.values()))
        cursor.commit()

Вышеупомянутая функция, кажется, хорошо работает с "одноуровневым" JSON, но эти данные в основном имеют таблицу / массив ( Дети) как колонна.

В SQL у меня есть две таблицы, как определено, как это, что, возможно, не способ справиться с этим:

SELECT TOP (1000) [LimitedTaxonomyId]
      ,[PartDetailsId]
      ,[NewPartCount]
      ,[Parameter]
      ,[ParameterId]
      ,[PartCount]
      ,[Value]
      ,[ValueId]
  FROM [Components].[dbo].[LimitedTaxonomy]

SELECT TOP (1000) [ChildrenId]
      ,[LimitedTaxonomyId]
      ,[NewPartCount]
      ,[Parameter]
      ,[ParameterId]
      ,[PartCount]
      ,[Value]
      ,[ValueId]
  FROM [Components].[dbo].[Children]

Я думаю, что мне нужно проверить thevalue, и если содержит список, который мне нужен, чтобы сначала извлечь этот список из thevalue, а затем передать оставшиеся данные в мою функцию create_sql. После этого я помещаю этот извлеченный список обратно через функцию create_sql, но сначала запрашиваю базу данных SQL, чтобы получить введенное значение [LimitedTaxonomyId].

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

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