python3 Windows下連接oracle數(shù)據(jù)庫(kù),報(bào)錯(cuò)解決,pandas讀取。

背景:工作需要,windows環(huán)境下要用python連接oracle,用pandas處理數(shù)據(jù)。
目標(biāo):連接oracle,并讀取為DataFrame格式。

連接oracle是個(gè)大坑,嘗試了很久終于整好了,總結(jié)一下中途發(fā)現(xiàn)的問(wèn)題。

連接oracle

1、下載cx_oracle包

遇事不決,先下包。

pip install cx_Oracle

安好以后興致勃勃的執(zhí)行一下代碼

import cx_Oracle                                                

conn = cx_Oracle.connect('用戶名/密碼@主機(jī)ip地址:端口號(hào)/SID') 
c = conn.cursor()                                                
x = c.execute('select sysdate from dual')                         
x.fetchall()
c.close()                                  
conn.close()      

然后不出意料的報(bào)錯(cuò)

報(bào)錯(cuò):cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "The specified module could not be found".

2、安裝 instant client

查詢后發(fā)現(xiàn)需要整上 instant client,又要分兩種情況:
1、已安裝oracle客戶端
2、未安裝oracle客戶端(需要連接服務(wù)器數(shù)據(jù)庫(kù)的情況
我是屬于第二種情況,第一種情況移步此處

2.1、直接上 oracle官網(wǎng) [下載](https://www.oracle.com/technetwork/cn/topics/winx64soft-101515-zhs.html)。
或復(fù)制文件下載鏈接:https://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_client.zip?AuthParam=1571646862_b88d6693cf92e9d501e6a4d14c58d462
下載完成后解壓安裝,選擇對(duì)應(yīng)的文件安裝。

2.2、再點(diǎn)擊下載這個(gè)壓縮包。

下載回是一個(gè)壓縮文件,解壓之后的文件夾叫 instantclient_11_2。
2.2.1、創(chuàng)建路徑:D:/Oracel/product/11.2.0

2.2.2、然后把instantclient_11_2丟進(jìn)去。

2.2.3、將文件中后綴為 dll 的文件復(fù)制到 anaconda 或者python 安裝位置。

dll 的文件

2.2.4、把以下3個(gè)程序放進(jìn)python安裝文件夾里的 Anaconda3\Lib\site-packages 中:
oci.dll
oraocci1.dll
oraociei1.dll

2.2.5、在D:/instantclient_11_2目錄下新建目錄network

2.2.4、在network目錄下再新建admin目錄,在admin目錄下新建文件tnsnames.ora,使用文本編輯器打開(kāi)寫入如下內(nèi)容:

里面的HOST,PORT,MWDB根據(jù)個(gè)人情況填寫
MWDB=
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.58)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SID)
    )
)

2.2.5、添加一個(gè)環(huán)境變量,名為TNS_ADMIN,值為tnsnames.ora文件所在路徑。比如我的本機(jī)為:D:/Oracel/product/11.2.0/instantclient_11_2/network/admin

2.2.6、再修改系統(tǒng)環(huán)境變量,D:/Oracel/product/11.2.0/instantclient_11_2。

系統(tǒng)環(huán)境變量

2.2.7、設(shè)置ORACLE的語(yǔ)言,添加環(huán)境變量NLS_LANG ,值為SIMPLIFIED CHINESE_CHINA.ZHS16GBK。
如果不清楚遠(yuǎn)程數(shù)據(jù)庫(kù)的ORACLE 語(yǔ)言,可以ssh或者telnet到遠(yuǎn)程機(jī)器,在命令界面輸入,用命令行連接到數(shù)據(jù)庫(kù)。

select value from nls_database_parameters where parameter='NLS_CHARACTERSET'
結(jié)果 NLS_LANG 值
ZHS16GBK SIMPLIFIED CHINESE_CHINA.ZHS16GBK
AL32UTF8 SIMPLIFIED CHINESE_CHINA.AL32UTF8

3、再次嘗試連接

import cx_Oracle                                                

conn = cx_Oracle.connect('用戶名/密碼@主機(jī)ip地址:端口號(hào)/SID') 

然后報(bào)錯(cuò) # # # 報(bào)錯(cuò):ORA-12514: TNS:

WDNMD !??!

查詢后發(fā)現(xiàn)是服務(wù)名有問(wèn)題,即上面的SID填寫錯(cuò)誤。
OK,上數(shù)據(jù)庫(kù)查詢服務(wù)名

select value from v$parameter where name like 'service_name%'

我查出來(lái)是 oracle_docker
然后修改后填入

conn = cx_Oracle.connect('用戶名/密碼@主機(jī)ip地址:端口號(hào)/oracle_docker') 

然后可以正常讀取出數(shù)據(jù)了?。?!。
(PS:網(wǎng)上參考資料,部分操作后需要重新啟動(dòng)Python才有效果)


4、pandas讀取oracle

import cx_Oracle
import os 
import pandas as pd

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'

conn = cx_Oracle.connect('UziSB/Uzi4800@192.168.0.58:1521/oracle_docker')  
print (conn.version)

c = conn.cursor()                                                
x = c.execute('select * from dual')                         
y = x.fetchall()
z = pd.DataFreme(y) 
c.close()                                  
conn.close()  

print (z)

會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,獲取的數(shù)據(jù)沒(méi)有columns名稱。

那么就只有用Python連接數(shù)據(jù)庫(kù)的好♂伙♂伴:sqlalchemy

import cx_Oracle
import os 
import pandas as pd
from sqlalchemy import creat_engine

conn = creat_engine('UziSB/Uzi4800@192.168.0.58:1521/oracle_docker')  

sql = "select * from dual"

z = pd.read_sql(sql , conn)
print (z)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容