混合数据类型的列将在带有python的postgres中保存为str和jsonb



我需要你的建议,但请不要对下面的代码感到震惊。

情境:我调用API来检索销售信息。响应如下:

[{'Id': 123,
'Currency': 'USD',
'SalesOrder': [{'Price': 2,
'Subitem': 1,
'Discount': 0.0,
'OrderQuantity': 1.0},
{'Price': 3,
'Subitem': 2,
'Discount': 0.0,
'OrderQuantity': 2.0}],
'Tax': 18},
{'Id': 124,
'Currency': 'USD',
'SalesOrder': [{'Price': 2,
'Subitem': 1,
'Discount': 0.0,
'OrderQuantity': 1.0},
{'Price': 3,
'Subitem': 2,
'Discount': 0.0,
'OrderQuantity': 2.0}],
'Tax': 18}]

预期结果:1。'Id"是独立列;"Currency"是一个独立的列。2.由于可能有不同数量的"Subitems",我想在postgres中添加"SalesOrder"作为json blob,然后查询json列。因此,最终结果是一个包含三列的postgres表。

id =[]
currency = []
salesOrder = []
#extracting values
for item in df:
id.append(item.get("Id")
currency.append(item.get("Currency"))
salesOrders.append(item.get("SalesOrder"))
#converting to a pandas df
df_id = pd.DataFrame(id)
df_currency = pd.DataFrame(currency)
df_sales_order = pd.DataFrame(salesOrder)
#concatenating cols
df_row = pd.concat([df_id, df_currency, df_sales_order], axis = 1)
#outputting results to a table
engine = create_engine('postgresql+psycopg2://username:password@endpoint/db')
with engine.connect() as conn, conn.begin():
df_row.to_sql('tbl', con=conn, schema='schema', if_exists='append', index = False)

疑虑:1。如果我尝试实现上面的代码,"SalesOrder"列表将被拆分为X列。为什么会这样?我该如何避免并保持一致?2.我不知道如何处理混合数据类型(str+jsonb(。我应该加载"非json"列,然后用json列更新表吗?

不要这样做"df_sales_order=pd.DataFrame(salesOrder(&";,只需在";df_ currency";像df_current["sales_order"],并用";item.get("SalesOrder"(;。这应该能解决问题。

最新更新