Python 安裝cx_Oracle模組
想訪問遠程Oracle資料庫,本地又不想安裝幾百兆的Oracle Client(也木有root許可權),安裝python的cx_Oralce 模組需要依賴Oracle Instant Client 代替完整的Oracle Client。
Oracle Instant Client 下載:http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
下載:
instantclient-basic-linux.x64-11.2.0.4.0.zip
instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
instantclient-sdk-linux.x64-11.2.0.4.0.zip
解壓檔案放到如下目錄:
$HOME/oracle/instantclient_11_2
拷貝tnsnames.ora檔案,在/home/oracle/instantclient_11_2目錄下建立network/admin目錄,並將tnsnames.ora檔案拷貝進去(這個貌似不是必要條件,出了問題的話就補上吧)
~/.bashrc設定:
export ORACLE_HOME=$HOME/oracle/instantclient_11_2export TNS_ADMIN=$ORACLE_HOME/network/adminexport DYLD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH
下面就是該安裝cx_Oracle的python模組了,下載直接python setup.py install
由於非root的許可權,會報無/lib64/python2.6/site-packages/目錄讀寫權限
可以改寫python的安裝目錄
export PATH=$ORACLE_HOME:$PATH
然後source .bashrc生效
接下來可以安裝了:python setup.py install --prefix=~/.local (牛逼閃閃啊,直接在原目錄前加了個本地目錄首碼,華麗麗的解決非root的壁壘)
順其自然的又報錯了(奔潰呀),/usr/bin/ld: cannot find -lclntsh
這個錯誤之前在mac上裝cx_Oracle時候沒遇到,百度解決方案,得知是沒有找到lib下的libclntsh.so函數庫
其實是有的,只不過名字改了,加軟連結:
ln -s libclntsh.so.11.1 libclntsh.so
再次安裝解決。
補充:
非root安裝rpm包
首先把RPM包解壓出來,然後放在自己的目錄下,並且添加好環境變數
解壓的命令為:
rpm2cpio ctags-5.8-2.el6.x86_64.rpm | cpio -idvm
這樣就會按包裡的目錄結構解壓到目前的目錄,如果是家目錄的話,可以在家目錄下的.bashrc這樣添加環境變數
vim ~/.bashrc
export PATH=$PATH:$HOME/usr/bin/
重新登入或者source ~/.bashrc
檔案,就可以使用這個程式了
easy_install --prefix=~/.local cx_Oracle
卸載:
python setup.py install --record record.txt --prefix=~/.local
然後刪除record.txt
裡的所有檔案
貼段cx_Oracle 使用代碼,作為備忘:
import cx_Oracle
class ConnectOracle:
def __init__(self, username, passwd, locate):
self.login = {}
self.db = None
self.cursor = None
self.login['username'] = username
self.login['passwd'] = passwd
self.login['locate'] = locate
def connect_oracle(self):
try:
self.db = cx_Oracle.connect(self.login['username'], self.login['passwd'], self.login['locate']) # 登入內搜資料庫
self.db.autocommit = False # 關閉自動認可
self.cursor = self.db.cursor() # 設定cursor游標
return True
except:
print 'can not connect oracle'
return False
def close_oracle(self):
self.cursor.close()
self.db.close()
def select_oracle(self, sql, num=0, temp=None):
if self.connect_oracle():
if temp:
self.cursor.executemany(sql, temp)
else:
self.cursor.execute(sql)
if num:
content = self.cursor.fetchmany(num)
else:
content = self.cursor.fetchall()
self.close_oracle()
return content
return False
def insert_oracle(self, sql, temp=None):
try:
self.connect_oracle()
if temp:
self.cursor.executemany(sql, temp)
# 執行多條sql命令
else:
self.cursor.execute(sql)
except:
print "insert異常"
self.db.rollback() # 復原
finally:
self.db.commit()
self.close_oracle()