繁体   English   中英

如何将 pandas 的数据框附加到 oracle 表?

[英]How can i append dataframe from pandas to the oracle table?

我想将数据框(熊猫)附加到我在 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 连接。 所以它找不到表并创建了另一个。 有没有办法将所有者或模式写入此函数?

我认为这可能会有所帮助:

import cx_Oracle
import pandas as pd

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()
cursor.close
con.close       

提供的插入权限已授予表tbl_deneme的模式prg

连接到 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

此外,一个动态选项,如果不存在,将通过使用第一行的列名创建一个表,并根据从第二行派生的列表的拆分元素插入值,而无需逐一明确指定变量列表,并且可能会提供更多性能选项以及使用cursor.executemany ,例如

import cx_Oracle
import pandas as pd

con = cx_Oracle.connect(user, password, host+':'+port+'/'+dbname)
cur = con.cursor()
tab_name = 'gnl.tbl_deneme'
cursor.execute('SELECT COUNT(*) FROM user_tables WHERE table_name = UPPER(:1) ',[tab_name])       
exs = cursor.fetchone()[0]
df = pd.read_csv('C:\\pathToFile\\denemedf.txt', sep = ',', dtype=str)
col=df.columns.tolist()
crt=""
for k in col:
    crt += ''.join(k)+' VARCHAR2(4000),'

if int(exs) == 0:
    crt = 'CREATE TABLE '+tab_name+' ('+crt.rstrip(",")+')'
    cursor.execute(crt)

vrs=""
for i in range(0,len(col)):
    vrs+= ':'+str(i+1)+','

cols=[]
sql = 'INSERT INTO '+tab_name+' VALUES('+vrs.rstrip(",")+')'
for i in range(0,len(df)):
    cols.append(tuple(df.fillna('').values[i]))
 
cursor.executemany(sql,cols)
con.commit()
cursor.close
con.close

考虑到 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()
 dataset.to_sql('dev_log',engine ,if_exists = 'append', index=False)

dev_log直接用作表名和engine直接用于连接不是 name='dev_log' and con = engine

参数: append: Insert new values to the existing table

所以我认为它可以将新行附加到现有表中,并且不会删除现有表中的任何行

熊猫.DataFrame.to_sql

暂无
暂无

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

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