我想将数据框(熊猫)附加到oracle中的表中。 但是这段代码会删除表中的所有行:(
我的数据框和结果变为:
0,0,0,ML_TEST,0,5 // 0,0,0,ML_TEST,0,6
import cx_Oracle
import pandas as pd
from sqlalchemy import types, create_engine
dataset = pd.read_csv("denemedf.txt", delimiter=",")
print(dataset)
from sqlalchemy import create_engine
engine = create_engine('oracle://***:***@***:***/***', echo=False)
dataset.to_sql(name='dev_log',con=engine ,if_exists = 'append', index=False)
如何在不删除该表中现有行的情况下将该数据框的行追加到表的最后?
现在,我再次尝试,现在追加到最后一个,但是在第一次尝试中,它删除了所有现有行。 如何有效地做到这一点而不会引起任何问题?
实际上,由于此表的架构,出现了问题。 该表位于gnl所有者中,但我与prg连接。因此它找不到表并创建另一个。 有什么办法将所有者或模式写入此函数吗?
答案 0 :(得分:1)
dataset.to_sql('dev_log',engine ,if_exists = 'append', index=False)
dev_log
直接用作表名,engine
直接用于连接而不是name ='dev_log'并且con = engine是
参数:append: Insert new values to the existing table
所以我认为它将在将新行添加到现有表时起作用,并且不会从现有表中删除任何行
答案 1 :(得分:1)
我认为这可能会有所帮助:
import cx_Oracle
import pandas as pd
from pandas import DataFrame, read_csv
dataset = pd.read_csv("C:\\pathToFile\\denemedf.txt", delimiter=",")
con = cx_Oracle.connect('uname/pwd@serverName:port/instanceName')
cursor = con.cursor()
sql='insert into gnl.tbl_deneme values(:1,:2,:3,:4,:5,:6)'
df_list = dataset.values.tolist()
n = 0
for i in dataset.iterrows():
cursor.execute(sql,df_list[n])
n += 1
con.commit()
已为表prg
的模式tbl_deneme
授予了提供的插入特权
(连接到gnl后-> grant insert on tbl_deneme to prg
)
假设您的文本文件(denemedf.txt
)
col1,col2,col3,col4,col5,col6
0, 0, 0, ML_TEST, 0, 5
0, 0, 0, ML_TEST, 0, 6
答案 2 :(得分:1)
考虑到 data_df 是数据框,它可以通过以下 3 行来完成
rows = [tuple(x) for x in data_df.values]
cur.executemany("INSERT INTO table_name VALUES (:1,:2,:3,:4)",rows)
con_ora.commit()