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
  1.  
  2. ORACLE_HOME="/usr/lib/oracle/11.2/client64"
  3. PATH=$PATH:$ORACLE_HOME/bin
  4. export PATH
  5. LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib
  6. export LD_LIBRARY_PATH
  7.  
:x 存檔離開

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


新增 Python 的測試程式 oratest.py
內容如下:
  1.  
  2. # -*- coding: utf-8 -*-
  3. import cx_Oracle
  4. conn = cx_Oracle.connect("帳號/密碼@IP/資料庫名", encoding = "UTF-8", nencoding = "UTF-8")
  5. curs = conn.cursor()
  6. curs.execute('SELECT * FROM 資料表名')
  7.  
  8.  
  9. # 原生方式是以欄位順序取得欄位值
  10. # 例如 row[0], row[1], ...
  11. # 我們要很明確知道 row[0], row[1] 各代表什麼欄位
  12. # 可讀性不高
  13.  
  14. # 我們可以繞個彎
  15. # 將資料集的欄位讀出並存入 list
  16. columns = [i[0] for i in curs.description]
  17.  
  18. # 這裡要注意
  19. # row 對欄位名並沒有大小寫分別
  20. # 但因我們以 curs.description 讀出的欄位名是大寫
  21. for row in curs:
  22. print 'field1 = ' + row[columns.index('FIELD1')]
  23.  
  24. conn.close()
  25.  


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

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




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

[root]# vi /etc/crontab
  1.  
  2. SHELL=/bin/bash
  3.  
  4. # 設置 oracle 環境變數
  5. PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/oracle/11.2/client64/bin
  6. ORACLE_HOME="/usr/lib/oracle/11.2/client64"
  7. LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:/usr/lib:/usr/local/lib
  8.  
  9. ...
  10. ...
  11.  
  12. 要執行的 python 程式
  13.  
:x 存檔離開


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