python - 写入 Oracle : TypeError: expecting string or bytes object

标签 python pandas oracle sqlalchemy cx-oracle

我一直在为这件事伤透脑筋。我试图将 65000 多行、51 列推送到 Oracle DB,但最终收到类型错误。有没有办法可以找出此错误来自哪一列,以便我可以进行调试。

另一个问题 - python 数据框中的数据类型“对象”可以读取 Oracle 中的“数字”数据类型吗?

Traceback (most recent call last):

  File "c:\users\so-go- activating strategic people capability - deliverable files\ finance\codes-to_use\s1_3_supply_forecasting_input_revamped.py", line 160, in <module>
    hcar.to_sql('HISTORICAL_HCAR', engine, if_exists='append', index=False,schema='HIM_PA_EXTERN_PROD_FIN',dtype=dtyp)

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\pandas\core\generic.py", line 2605, in to_sql
    sql.to_sql(

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\pandas\io\sql.py", line 589, in to_sql
    pandas_sql.to_sql(

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\pandas\io\sql.py", line 1398, in to_sql
    table.insert(chunksize, method=method)

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\pandas\io\sql.py", line 830, in insert
    exec_insert(conn, keys, chunk_iter)

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\pandas\io\sql.py", line 747, in _execute_insert
    conn.execute(self.table.insert(), data)

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\sqlalchemy\engine\base.py", line 1011, in execute
    return meth(self, multiparams, params)

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\sqlalchemy\sql\elements.py", line 298, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\sqlalchemy\engine\base.py", line 1124, in _execute_clauseelement
    ret = self._execute_context(

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\sqlalchemy\engine\base.py", line 1316, in _execute_context
    self._handle_dbapi_exception(

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\sqlalchemy\engine\base.py", line 1514, in _handle_dbapi_exception
    util.raise_(exc_info[1], with_traceback=exc_info[2])

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\sqlalchemy\engine\base.py", line 1256, in _execute_context
    self.dialect.do_executemany(

  File "C:\ProgramData\Anaconda3-2020.11\lib\site-packages\sqlalchemy\dialects\oracle\cx_oracle.py", line 1182, in do_executemany
    cursor.executemany(statement, parameters)

TypeError: expecting string or bytes object

最佳答案

不幸的是,Oracle 不会告诉您哪一列导致了错误。所以这是一个 Python/cx_Oracle 问题,而不是真正的 Oracle 问题。我假设当你说“数据帧”时,你指的是 Pandas 数据帧,而不是 PySpark/Dask/Veux/etc。

several similar questions关于 Pandas 数据帧的此错误。问题通常是 Pandas 数据框列具有 dtype,但行不必全部匹配该类型 - object 列将允许每行都有不同的类型。

# example - an int, a float, and a str in the same column
pd.DataFrame([12, np.NaN, 'hi'], columns=['ABC'])

当您(或 sqlalchemy)使用 executemany() 时,所有行都必须具有相同的匹配列类型集。

You can check the types in a single column通过使用:

df['ABC'].map(type)

因此您可以使用以下内容立即检查数据框中的所有列:

df.applymap(type).nunique()

显示每列包含的类型数量。任何列 > 1 都可能导致此错误。在发送到 Oracle 之前,使用 df['ABC'].astype(str)df['ABC'].fillna('') 修复它。

关于python - 写入 Oracle : TypeError: expecting string or bytes object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70621699/

相关文章:

python - 如何根据列中元素的数量从 Pandas 数据框中删除一行

python - 比较 Pandas 不同年份的同一天

python - 正则表达式:匹配括号贪婪和非贪婪

python - `tf.contrib.layers.max_pool2d` 和 `tf.nn.max_pool` 和有什么本质区别?

python - 使用 `with open(...)` 解析 csv 文件时 `pandas` 有什么功能?

c# - ORA-01036 : illegal variable name/number when running query through C#

oracle - 如何使用 VARRAY 参数调试存储过程?

oracle - 使用 DBMS Profiler 构建 PL/SQL 覆盖率报告

python - super 会尝试 MRO 中的每个类吗

python - 在 python 中循环一个正则表达式替换一个字符串——缺少一些明显的东西