捕获 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 numbererror。我想知道是否有一种方法可以获得产生错误的确切行数据,否则每次遇到此类错误时都很难调试?使用的堆栈跟踪没有提供任何进一步的细节。

【问题讨论】:

【参考方案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

Python executemany 函数

在 cx_Oracle 上执行许多 CLOB 元素

Python 3.6 - “字符串%元组”做啥?