如何将pandas中的数组追加到Oracle表中?

k4ymrczo  于 5个月前  发布在  Oracle
关注(0)|答案(3)|浏览(55)

我想在Oracle中的表中添加pandas(pandame)。但这段代码删除了表中的所有行:(
我的矩阵和我的结果变成这样:

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。所以它找不到这个表并创建了另一个。这是任何方法来写入所有者或模式到这个函数中吗?

uttx8gqw

uttx8gqw1#

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

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


此外,可以提供一个动态选项,该选项将通过使用第一行的列名创建一个表 if not exists,并根据从第二行导出的 values 列表的拆分元素插入值,而无需逐个显式指定变量列表,还可以提供沿着使用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()

uwopmtnx

uwopmtnx2#

考虑到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()

字符串

at0kjp5o

at0kjp5o3#

dataset.to_sql('dev_log',engine ,if_exists = 'append', index=False)

字符串
dev_log直接用作表名,engine直接用于连接not name ='dev_log'和con = engine是
参数:append: Insert new values to the existing table
所以我认为它将工作追加新行到现有的表,它不会从现有的表delte任何行
pandas.DataFrame.to_sql

相关问题