【问题标题】:Problems while inserting df values with python into Oracle db使用 python 将 df 值插入 Oracle db 时出现问题
【发布时间】:2021-12-09 03:08:41
【问题描述】:

我在尝试将数据从 df 插入 Oracle 数据库表时遇到问题,这是错误:DatabaseError: ORA-01036: 非法变量名/编号

这些是我做的步骤:

这是我从 yfinance 包中导入并详细说明的数据框,以尊重我的 df 数据类型的完整性

我将我的 df 转换成一个列表,这些是我在列表中的数据:

这是我要插入数据的表:

这是代码:

sql_insert_temp = "INSERT INTO TEMPO('GIORNO','MESE','ANNO') VALUES(:2,:3,:4)"

index = 0
for i in df.iterrows():
   cursor.execute(sql_insert_temp,df_list[index])
   index += 1
connection.commit()

我已经尝试在 sqldeveloper 工作表中进行一次插入,使用您在列表中可以看到的数据,并且它有效,所以我想我在代码中犯了一些错误。我看过其他讨论,但我找不到任何解决我的问题的方法。你知道我该如何解决这个问题,或者是否有可能以其他方式做到这一点?

我尝试打印迭代查询,结果就是这样,这就是它没有插入我的数据的原因:

【问题讨论】:

  • 可能的 根本原因 - 这是在 Oracle invalid 列名中(用撇号引用)"INSERT INTO TEMPO('GIORNO','MESE','ANNO') 你应该使用 quotes'INSERT INTO TEMPO("GIORNO","MESE","ANNO")。另外executemany会更好。
  • 除了建议的to_sql 方法外,永远不要使用循环和插入,因为它非常慢:每次循环通过时往返和解析太多。使用executemany 和元组列表来执行批量插入。

标签: python pandas oracle list dataframe


【解决方案1】:

如果你已经有了pandas DataFrame,那么你应该可以使用pandas库提供的to_sql()方法。

import cx_Oracle
import sqlalchemy
import pandas as pd

DATABASE = 'DB'
SCHEMA   = 'DEV'
PASSWORD = 'password'
connection_string  = f'oracle://{SCHEMA}:{PASSWORD}@{DATABASE}'
db_conn     = sqlalchemy.create_engine(connection_string)

df_to_insert = df[['GIORNO', 'MESE', 'ANNO']] #creates a dataframe with only the columns you want to insert

df_to_insert.to_sql(name='TEMPO', con=db_connection, if_exists='append') 
  • name 是表的名称
  • con 是连接对象
  • if_exists='append' 会将行添加到表的末尾。还有其他选项可以添加失败或删除并重新创建表

其他参数可以在 pandas 网站上找到。 pandas.to_sql()

【讨论】:

  • 现在我收到了这个错误:DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ORA-01036: 非法变量名/编号。我是否可能需要与 sqlalchemy 建立连接?
  • 是的,Oracle 需要 SQLAlchemy,Using SQLAlchemy makes it possible to use any DB supported by that library. Legacy support is provided for sqlite3.Connection objects 参见 doc
  • 您使用什么模块来创建数据库连接?
  • @el_oso 我正在使用 cx_Oracle,但是如何使用没有循环的 executemany 来插入所有内容?如果我很固执,我很抱歉,这是我第一次使用python做这样的事情ç_ç
  • 不需要循环。 pandas 模块将自动处理数据框中的所有行。这可能会导致大型 DataFrame 出现问题,因此您可以使用块大小参数告诉 pandas 一次分批插入 50、100、1k 行。同样,这一切都在后台处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2023-02-04
  • 2020-02-04
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多