из pandas перенос данных в таблицу oracle на основе первичного ключа - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть таблица 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

Я хочу обновите oracle таблицу grp_id 0024 и 0027 с обновленными значениями grp_nm и mrg_id из фрейма данных. Также хочу вставить новый grp_id 0029 в таблицу. Не могли бы вы помочь?

Ограничения: У меня нет доступа oracle db, поэтому я не могу создать временную таблицу из df и затем обновить тестовую таблицу из временной таблицы. Кроме того, это просто пример данных. У меня есть почти 200 тысяч строк для обработки.

Ожидаемый результат:

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

1 Ответ

0 голосов
/ 21 марта 2020

Вы можете использовать оператор 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 обновляются для уже существующих значений для столбца GRP_ID в таблице и добавляются новые записи для несуществующих значений для столбца GRP_ID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...