Я работаю над тем, чтобы взять 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]
.
Это звучит как большой беспорядок и, возможно, это единственный способ, но я хотел бы получить второе мнение о том, как я поступаю по этому поводу и, возможно, есть лучший способ.