繁体   English   中英

基于主键从 Pandas 数据帧 upsert 到 oracle 表

[英]from pandas dataframe upsert into oracle table based on primarykey

我有一个 Oracle 表,其中的数据如下 -

select * from test
GRP_ID  GRP_NM      MRG_ID
0024    Abac Expl   17
0027    Wlsy Inc    8404

我有一个数据框,其中更新后的数据如下-

print(df)
    grp_id  grp_nm          mrg_id
0   0024    Abac Sol        17
1   0027    Wlsy Inc        8407
2   0029    Xyz Corp        1986

我想用数据帧中 grp_nm 和 mrg_id 的更新值更新 oracle 表 grp_id 0024 和 0027。 还想将新的 grp_id 0029 插入表中。 能否请你帮忙?

约束:我没有 oracle db 访问权限,所以我无法从 df 创建临时表,然后从临时表更新测试表。 此外,这只是示例数据。 我有将近 20 万行要处理。

预期输出:

sql > select * from test; 
GRP_ID GRP_NM MRG_ID 
0024 Abac Sol 17 
0027 Wlsy Inc 8407 
0029 Xyz Corp 1986

您可以将Merge语句与数据Dataframe一起使用

import cx_Oracle
import pandas as pd
from pandas import DataFrame

dataset = pd.DataFrame({'GRP_ID': ['0024','0027','0029'],
                        'GRP_NM': ['Abac Sol','Wlsy Inc','Xyz Corp'],
                        'MRG_ID': [17,8404,1986]})
con = cx_Oracle.connect('uname/pwd@host:port/service_name')
cursor = con.cursor()

sql ='merge into test ';
sql+=' using dual';
sql+='   on ( grp_id = :1 )';
sql+=' when matched then update set grp_nm = :2, mrg_id = :3';  
sql+=' when not matched then insert( grp_id, grp_nm, mrg_id )'; 
sql+='                       values( :1, :2, :3 )';
df_list = dataset.values.tolist()

for i in range(len(df_list)):
    cursor.execute(sql,df_list[i])

con.commit()

其中GRP_NMMRG_ID列针对表中GRP_ID列的现有值更新,并为GRP_ID列的不存在值添加新记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM