我一直在努力解決這個問題。我正在嘗試將 51 列的 65000 行推送到 oracle DB,但我最終收到型別錯誤。有沒有辦法可以找出這個錯誤來自哪一列,以便我可以除錯。
另一個問題 - python 資料框中的資料型別“物件”可以在 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
uj5u.com熱心網友回復:
不幸的是,Oracle 不會告訴您是哪一列導致了錯誤。所以這是一個 Python / cx_Oracle 問題,而不是真正的 Oracle 問題。而且我假設當您說“資料框”時,您的意思是 Pandas 資料框,而不是 PySpark/Dask/Veux/等。
關于 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(),所有行都必須具有相同的匹配列型別集。
您可以使用以下方法檢查單個列中的型別:
df['ABC'].map(type)
因此,您可以一次檢查資料框中的所有列,例如:
df.applymap(type).nunique()
其中顯示了每列包含的型別數。任何 > 1 的列都可能會導致此錯誤。使用df['ABC'].astype(str)或df['ABC'].fillna('')在發送到 Oracle 之前修復它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/407682.html
標籤:
下一篇:向舊表添加主鍵列
