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

2024-10-06 08:32:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要你的建议,但请不要对下面的代码感到恐惧

情景:我调用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'是一个独立的列;'“货币”是一个独立的列。2.由于可能有不同数量的“子项”,我考虑在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列更新表吗


Tags: idjsondfgetdiscountitempricecurrency
1条回答
网友
1楼 · 发布于 2024-10-06 08:32:59

而不是这样做“df_sales_order=pd.DataFrame(salesforder) ,只需在“df_currency”中创建一列,如df_currency[“sales_order”]并用“item.get(“salesforder”)”填充即可。这应该可以解决问题

相关问题 更多 >