簡體   English   中英

寫入 Oracle:TypeError:期望字符串或字節 object

[英]Writing to Oracle: TypeError: expecting string or bytes object

我一直在努力解決這個問題。 我正在嘗試將 51 列的 65000+ 行推送到 oracle DB,但我最終收到類型錯誤。 有沒有辦法可以找出這個錯誤來自哪一列,以便我可以調試。

另一個問題 - python dataframe 中的數據類型“對象”能否被讀取為 Oracle 中的“數字”Dtype?

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 dataframe,而不是 PySpark/Dask/Veux/等。

Pandas 數據幀有幾個類似問題 問題通常是 Pandas dataframe 列具有dtype ,但行不必都匹配該類型- object列將允許每行中的不同類型。

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

當您(或 sqlalchemy)使用executemany()時,所有行都必須具有相同的匹配列類型集。

您可以使用以下方法檢查單個列中的類型

df['ABC'].map(type)

因此,您可以一次檢查 dataframe 中的所有列,例如:

df.applymap(type).nunique()

其中顯示了每列包含的類型數。 任何 > 1 的列都可能會導致此錯誤。 在發送到 Oracle 之前使用df['ABC'].astype(str)df['ABC'].fillna('')修復它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM