2018-06-26

【Python】CentOS 7 使用 cx_Oracle 連線 Oracle 9i

參考資料 ----
Python Oracle drivers


Python 連線 Oracle 的驅動程式有很多種,因為 CentOS7 預設使用 cx_Oracle,並且其他驅動有涉及到版權規範,因此老人家還是選擇 cx_Oracle


* 以 root 身份登入 CentOS 7


* 到 Oracle 官網,(若無帳號就申請建立一個),登入、下載並安裝  oracle-instantclient11.2-basic.x86_64.rpm,   oracle-instantclient11.2-devel.x86_64.rpm, oracle-instantclient11.2-sqlplus.x86_64.rpm
因為 Oracle 官網常改版,所以自己要花點時間去摸索尋找。


* 新增並編輯 oracle.sh
[root]# vi  /etc/profile.d/oracle.sh
 
ORACLE_HOME="/usr/lib/oracle/11.2/client64"
PATH=$PATH:$ORACLE_HOME/bin
export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib
export LD_LIBRARY_PATH
 
:x 存檔離開

重開機, 讓 oracle.sh 設定生效


新增 Python 的測試程式 oratest.py
內容如下:
 
# -*- coding: utf-8 -*-
import cx_Oracle
conn = cx_Oracle.connect("帳號/密碼@IP/資料庫名", encoding = "UTF-8", nencoding = "UTF-8")
curs = conn.cursor()
curs.execute('SELECT  *  FROM  資料表名')


# 原生方式是以欄位順序取得欄位值
# 例如 row[0], row[1], ...
# 我們要很明確知道 row[0], row[1] 各代表什麼欄位
# 可讀性不高

# 我們可以繞個彎
# 將資料集的欄位讀出並存入 list
columns = [i[0] for i in curs.description]

# 這裡要注意
# row 對欄位名並沒有大小寫分別
# 但因我們以 curs.description 讀出的欄位名是大寫
for row in curs:  
    print 'field1 = ' + row[columns.index('FIELD1')]

conn.close()
 


附帶看一下 curs.description 的內容:

[('FIELD1', , 2, 2, None, None, 0), ('FIELD2', , 8, 8, None, None, 0), ...]




要注意的是,若您的 Python 程式要放入排程跑,則要再加環境變數的設定:

[root]# vi /etc/crontab
 
SHELL=/bin/bash

# 設置 oracle 環境變數
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/oracle/11.2/client64/bin
ORACLE_HOME="/usr/lib/oracle/11.2/client64"
LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:/usr/lib:/usr/local/lib

...
...

要執行的 python 程式
 
:x 存檔離開


不然您會發現,crontab 到指定時間有執行,資料卻沒存入 Oracle