在我的本地機器上
我在 python 中創建了一個從 Oracle 資料庫中檢索資料的腳本。使用cx_Oracle完成與資料庫的連接:
con = cx_Oracle.connect (username, password, dbService)
使用 SQL developer 時,使用自定義 JDBC建立連接。
在 Linux 服務器上復制程序。
- 我創建了一個安裝了 cx-Oracle pip 的 python 虛擬環境。
- 我在服務器中安裝了 Oracle Client 19.3.0,并且檔案夾 Instantclient就位。
當我嘗試按原樣執行 python 腳本時,出現以下錯誤。
cx_Oracle.DatabaseError:DPI-1047:找不到 64 位 Oracle 客戶端庫:DPI-1047:找不到 64 位 Oracle 客戶端庫:“libclntsh.so:無法打開共享物件檔案:沒有這樣的檔案或目錄”。請參閱https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html獲取幫助
我認為問題出在 Oracle 路徑上,這不是 python 所期望的。因此,我添加了這行額外的代碼,以精確定位 Oracle 庫所在的路徑。
cx_Oracle.init_oracle_client(lib_dir=r"/apps/oracle/product/19.3.0/lib")
這會導致不同的錯誤:
cx_Oracle.DatabaseError:嘗試檢索錯誤 ORA-01804 的文本時出錯
有什么線索嗎?
uj5u.com熱心網友回復:
cx_Oracle 初始化檔案指出,在 Linux上init_oracle_client()并沒有真正做到你認為的那樣。在 Python 行程開始之前,您仍然必須設定系統庫搜索路徑以包含 Oracle 庫。
我是否正確理解裝有 Python 的機器同時安裝了 DB 和 Instant Client?
如果您確實希望 Python 使用 Instant Client 庫,則將 LD_LIBRARY_PATH 設定為其位置并且不要設定ORACLE_HOME。
如果您在使用 Python 的機器上安裝了完整的 Oracle DB,則可以洗掉 Instant Client。在啟動 Python 之前,您需要設定 ORACLE_HOME、LD_LIBRARY_PATH 和其他任何需要的東西 - 通常運行source /usr/local/bin/oraenv。這應該將系統庫搜索路徑設定為 include /apps/oracle/product/19.3.0/lib。像這樣(未經測驗)的代碼片段可能會有所幫助:export ORACLE_SID=ORCLCDB;set ORAENV_ASK=NO; source /usr/local/bin/oraenv. 確保 Python 行程對 ORACLE_HOME 目錄具有讀取權限。
cx_Oracle 安裝指南討論了所有這些。
uj5u.com熱心網友回復:
ORA-1804訊息表明了我的問題的答案。
根據Oracle初始化檔案:https ://cx-oracle.readthedocs.io/en/latest/user_guide/initialization.html#usinginitoracleclient
請注意,如果您在 Linux 和相關平臺上設定了 lib_dir,則在啟動 Python 之前,您仍然必須配置系統庫搜索路徑以包含該目錄。
在任何作業系統上,如果將 lib_dir 設定為完整資料庫或完整客戶端安裝的庫目錄,則需要事先設定 Oracle 環境,例如通過設定 ORACLE_HOME 環境變數。否則你會得到像ORA-1804這樣的錯誤。您應該在啟動 Python 之前設定這個和其他 Oracle 環境變數,如 Oracle 中所示
即使定義 ORACLE_HOME 應該在啟動 Python 之前完成(根據 Oracle 檔案),也可以通過修改 Python 腳本本身來完成。因此,在 oracle 客戶端初始化命令之前,必須添加以下命令:
import os
# Setup Oracle paths
os.environ["ORACLE_HOME"] = '/apps/oracle/product/19.3.0'
os.environ["ORACLE_BASE"] = '/apps/oracle'
os.environ["ORACLE_SID"] = 'orcl'
os.environ["LD_LIBRARY_PATH"] = '/apps/oracle/product/19.3.0/lib'
import cx_Oracle
# Initialize Oracle client
cx_Oracle.init_oracle_client(lib_dir=r"/apps/oracle/product/19.3.0/lib")
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/414329.html
標籤:
上一篇:在SQLoracle中回圈,在完成執行之前顯示DBMS_OUTPUT.PUT_LINE
下一篇:從varchar2表中選擇
