pandas 为cx_Oracle动态使用INSERT- Python

oxf4rvwz  于 2022-12-02  发布在  Oracle
关注(0)|答案(1)|浏览(161)

我四处找了找希望有人能帮忙
我尝试在python中使用cx_Oracle与数据库进行接口;我任务是将数据从excel文件插入到一个空的(但已存在的)表中。
我有一个excel文件,其中几乎所有的列名都与数据库表中的列相同,因此我实际上想检查这些列是否共享相同的名称;如果是,我将excel(dataframe--pandas)文件中列插入到Oracle的表中。

import pandas as pd
import numpy as np
import cx_Oracle

df = pd.read_excel("employee_info.xlsx")

con = None
try:
    con = cx_Oracle.connect (
          config.username,
          config.password,
          config.dsn,
          encoding = config.encoding)
except cx_Oracle.Error as error:
      print(error)
finally:
       cursor = con.cursor()
       rows = [tuple(x) for x in df.values]
       cursor.executemany( ''' INSERT INTO ODS.EMPLOYEES({x} VALUES {rows})   '''

我不确定我应该放置什么sql,或者是否有一种方法可以使用for循环来迭代列,但我的主要问题源于当我们的数据集在列中增长时,我如何动态地添加这些for?
我使用以下命令检查匹配的列:

sql = "SELECT * FROM ODS.EMPLOYEES"
cursor.execute(sql)
data = cursor.fetchall()
col_names = []
for i in range (0, len(cursor.description)):
    col_names.append(cursor.description[i][0])

a = np.intersect1d(df.columns, col_names)
print("common columns:", a)

它给出了所有公共列的列表;我已经重命名了Excel文件中的列,以匹配数据库表中的列,但我的问题是,如何以动态/自动化的方式匹配这些列,以便我可以继续向数据集添加内容,而不必担心更改代码。

  • 额外的好处 *:我还在case语句中导入SQL,以创建一个新列,并在其中汇总其他几个列;是否有办法将其添加到SQL的第一部分,或者是否建议在使用insert语句之前进行所有操作,了解这些信息也会有所帮助。
wecizke3

wecizke31#

请看https://github.com/oracle/python-oracledb/blob/main/samples/load_csv.py
您可以用解析 Dataframe 来替换CSV阅读位。您需要构造一个与该示例中使用的语句类似的SQL语句:

sql = "insert into LoadCsvTab (id, name) values (:1, :2)"

对于您确定与表列匹配的每个电子表格列,构造语句的(id, name)位,并将另一个id添加到绑定部分(:1, :2)

相关问题