从 pandas 数据帧根据主键更新到 oracle table
from pandas dataframe upsert into oracle table based on primarykey
我有一个 Oracle table,其中的数据如下 -
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 table grp_id 0024 和 0027。还想将新的 grp_id 0029 插入 table。你能帮忙吗?
约束:我没有 oracle 数据库访问权限,所以我无法从 df 创建临时 table,然后从临时 table 更新测试 table。此外,这只是示例数据。我有将近 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_NM
和 MRG_ID
列针对 table 中 GRP_ID
列的现有值进行更新,并为不存在的值添加新记录对于 GRP_ID
列。
我有一个 Oracle table,其中的数据如下 -
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 table grp_id 0024 和 0027。还想将新的 grp_id 0029 插入 table。你能帮忙吗?
约束:我没有 oracle 数据库访问权限,所以我无法从 df 创建临时 table,然后从临时 table 更新测试 table。此外,这只是示例数据。我有将近 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_NM
和 MRG_ID
列针对 table 中 GRP_ID
列的现有值进行更新,并为不存在的值添加新记录对于 GRP_ID
列。