Python 安裝cx_Oracle模組

來源:互聯網
上載者:User

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

下載:

  1. instantclient-basic-linux.x64-11.2.0.4.0.zip
  2. instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
  3. 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這樣添加環境變數

  1. vim ~/.bashrc
  2. 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()

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.