捕获 cx_Oracle executemany() 批量插入错误“期望数字”
Posted
技术标签:
【中文标题】捕获 cx_Oracle executemany() 批量插入错误“期望数字”【英文标题】:Catch cx_Oracle executemany() batch insert error "expecting number" 【发布时间】:2021-07-17 20:25:34 【问题描述】:我有 56 列和几百万行,我使用以下代码将它们插入到我的 Oracle 表中:
import traceback
import sys
try:
conn = cx_Oracle.connect()
cursor = conn.cursor()
df_local = df_scores.astype(object).where(pd.notnull(df_scores), None).copy()
q_t = '''INSERT INTO Table VALUES ( to_date( :1, 'yyyy-mm-dd hh24:mi:ss'), '''
s=''
for i in range(2, 56):
s = s + ':'+str(i)+','
s = s[0:-1] + ' )'
q_t = q_t + s
rows = [tuple(x) for x in df_local.values]
cursor.executemany(q_t, rows)
conn.commit()
except:
print(traceback.print_exc())
print(sys.exc_info()[2])
在某行我收到TypeError: expecting number
error。我想知道是否有一种方法可以获得产生错误的确切行数据,否则每次遇到此类错误时都很难调试?使用的堆栈跟踪没有提供任何进一步的细节。
【问题讨论】:
【参考方案1】:如果您要查找哪些行包含无效数据,您可以在executemany()
期间设置batcherrors=True
。这将为您提供插入期间失败的所有行的列表。您可以在此处找到一个具有更详细说明的示例:https://cx-oracle.readthedocs.io/en/latest/user_guide/batch_statement.html#handling-data-errors。
【讨论】:
不幸的是,仍然得到同样的错误:rows = [tuple(x) for x in df_local.values] cursor.executemany(q_t, rows, batcherrors=True) TypeError: expecting number以上是关于捕获 cx_Oracle executemany() 批量插入错误“期望数字”的主要内容,如果未能解决你的问题,请参考以下文章
Python cx_Oracle。用 executemany() 敲头
在 Python 中使用 cx_Oracle 中的 executemany() 从批量插入数据加载中查找错误记录
在 Python 中使用 cx_Oracle 和 xlrd 列出列表的 executemany() 正在返回 TypeError