Python使用cx_Oracle的幾個小坑

引言

cx_Oracle是Python環(huán)境下的一個(好像也是唯一的一個)用于操作Oracle的第三方模塊。
最近在寫某個對帳程序時,不得已要連接一臺Oracle庫,于是用到了cx_Oracle,總的來說還是比較順利的,期間遇到幾個有意思的小坑寫出來分享一下。

RHEL 6.4下安裝cx_Oracle

RHEL6.4和cx_Oracle比較搭,安裝時應(yīng)該不會遇到什么挫折,使用RPM安裝好instantclient后,直接用pip3安裝cx_Oracle即可。

需要注意地方:

  1. 盡量使用RPM方式安裝instantclient,安裝更方便,而且比zip更好管理。
  2. instantclient的版本選擇的是11.2.0.4.0,沒有選擇12。對于Oracle/WebLogic這類閉源的東西,還是選擇次最新版本的比較穩(wěn)妥。

安裝步驟:

  1. 下載Linux版本的instantclient
    這里是 Oracle官網(wǎng) instantclient下載頁面 ,下載以下3個RPM包:
    oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
    oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
    oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm

  2. 安裝instantclient并設(shè)置環(huán)境變量

yum -y install libaio bc flex
rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
rpm -ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
  1. 設(shè)置環(huán)境變量
echo 'export ORACLE_VERSION="11.2"' >> $HOME/.bashrc
echo 'export ORACLE_HOME="/usr/lib/oracle/$ORACLE_VERSION/client64/"' >> $HOME/.bashrc
echo 'export PATH=$PATH:"$ORACLE_HOME/bin"' >> $HOME/.bashrc
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"$ORACLE_HOME/lib"' >> $HOME/.bashrc
source $HOME/.bashrc
  1. 使用pip安裝cx_Oracle
pip3 install cx_Oracle

macOS 12下安裝cx_Oracle

macOS下,安裝cx_Oracle后的編譯過程有可能會報錯,一般是因為instantclient安裝有誤造成的。

需要注意的地方:

  1. mac下的instantclient只有zip包一種安裝方式,要注意手工建兩個軟鏈接。
  2. pip安裝前,注意導(dǎo)入LD_LIBRARY_PATH與DYLD_LIBRARY_PATH兩個環(huán)境變量。

安裝過程:

  1. 下載Mac版本的instantclient
    下載以下3個zip包,并unzip解壓至同一目錄:
    instantclient-basic-macos.x64-11.2.0.4.0.zip
    instantclient-sdk-macos.x64-11.2.0.4.0.zip
    instantclient-sqlplus-macos.x64-11.2.0.4.0.zip

  2. 建立軟鏈接

cd /path/to/instant
ln -s libclntsh.dylib.11.2 libclntsh.dylib
ln -s libocci.dylib.11.2 libocci.dylib
  1. 設(shè)置環(huán)境變量
export ORACLE_VERSION="11.2"
export ORACLE_HOME="/path/to/instantclient_11_2"
export PATH=$PATH:"$ORACLE_HOME"
  1. 使用pip安裝cx_Oracle,注意提前導(dǎo)入DYLD_LIBRARY_PATH與LD_LIBRARY_PATH
export DYLD_LIBRARY_PATH="$ORACLE_HOME"
export LD_LIBRARY_PATH="$ORACLE_HOME"
pip3 install cx_Oracle

中文亂碼問題

Oracle中文亂碼問題存在已久,使用cx_Oracle時也不例外,解決方法還是設(shè)置NLS_LANG環(huán)境變量。
有兩種方式,一是在系統(tǒng)中設(shè)置永久環(huán)境變量,二是直接在代碼中使用os.environ設(shè)置環(huán)境變量,這里推薦后者。

  1. 方法一:在Shell中設(shè)置環(huán)境變量
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8"
  1. 方法二:直接在代碼中加入:
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

PyCharm下不識別cx_Oracle問題

安裝安成后,在python的console中已經(jīng)可以import cx_Oracle了,但在PyCharm中卻提示找不到cx_Oracle。這是一個比較大的坑,可以詳細講一下處理過程。

首先初步定位到原因,是由于PyCharm中沒有定義LD_LIBRARY_PATH與DYLD_LIBRARY_PATH兩個環(huán)境變量造成的。
PyCharm會自動讀取系統(tǒng)中的環(huán)境變量設(shè)置并導(dǎo)入,但唯獨這兩個沒有導(dǎo)進來。不深究原因,先嘗試手工在PyCharm中配置這兩個環(huán)境變量,總共有兩處可以配置:

第一處:
CMD+,打開Preference,找到 Build,Execution,Deployment -> Console -> Python Console ->Enviroment Variables


此處的配置會修復(fù)PyCharm中的Console。

第二處:
右上角 Run -> Edit Configurations,添加兩條環(huán)境變量


此處的配置會修復(fù)PyCharm中Ctrl+Shift+R運行代碼時的報錯。

在以上兩處手工添加環(huán)境變量:

DYLD_LIBRARY_PATH=/path/to/instantclient
LD_LIBRARY_PATH/path/to/instantclient

兩處的環(huán)境變量配置完成后,雖然console中可以正常使用cx_Oracle了,代碼也可以正常運行了,但編輯界面中的inspection還是有問題的,提示有Error,并且不能使用自動完成功能。

于是回到之前的問題,為什么明明已經(jīng)定義了,但PyCharm卻沒有找到LD_LIBRARY_PATH與DYLD_LIBRARY_PATH?
同時偶然發(fā)現(xiàn),在執(zhí)行env命令查看已定義的環(huán)境變量時,也是找不到LD_LIBRARY_PATH與DYLD_LIBRARY_PATH的。
這貌似已經(jīng)不是PyCharm自身的問題了,需要從macOS系統(tǒng)來著手了。

于是在stackoverflow上找到了這么一段話:

El Capitan added system integrity protection (SIP), and one side effect of that is that exporting DYLD_LIBRARY_PATH doesn't work. That could affect running SQL*Plus from a shell script, for example. There are workarounds for the 11g instant client. The installation notes at the bottom of the download page have changed since I last did this, and it now says to hard link the library files to the user's ~/lib directory to avoid that issue. Fortunately it looks like you don't need to worry about that with the 12c client - they've fixed the way it's built.

看來根本原因是OSX 10.11之后加入的這個SIP引發(fā)的了。

首先想到的最簡單的方法,將所有的.dylib.h都拷貝到系統(tǒng)默認的目錄就可以了。
但很杯具,/usr/lib/usr/include這兩個目錄也被SIP保護了。因為不想強制關(guān)閉SIP,繼續(xù)再想別的辦法。
接著發(fā)現(xiàn)/usr/local/lib/usr/local/include目錄還是可以操作的,于是拷到這兩個目錄:

cd /path/to/instantclient
cp *.dylib /usr/local/lib
cp ./sdk/include/*.h /usr/local/include

再將cx_Oracle卸載后重新編譯安裝:

sudo pip3 uninstall cx_Oracle
sudo pip3 install cx_Oracle

重啟PyCharm后,問題解決。

cx_Oracle的簡單使用

cx_Oracle的使用上沒有什么問題,一切按套路來寫就可以了。貼一個簡單的示例:

import cx_Oracle
conn = cx_Oracle.connect('username', 'password','host:port/sid')
cursor = conn.cursor()
cursor.execute('select column from table')
result = cursor.fetchall()
for row in result:
    print(row)
cursor.close()
conn.close()

更加詳細的內(nèi)容請參考官方文檔:
https://cx-oracle.readthedocs.io/en/latest/
https://oracle.github.io/python-cx_Oracle/

參考文檔

https://gist.github.com/thom-nic/6011715
http://stackoverflow.com/questions/37711482/how-to-install-oracle-instant-client-on-a-mac

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內(nèi)容