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)的問題。

連接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,使用文本編輯器打開寫入如下內(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 Q妗3上础!

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

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

我查出來是 oracle_docker
然后修改后填入

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

然后可以正常讀取出數(shù)據(jù)了8鼻R4弧!淆储。
(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è)問題本砰,獲取的數(shù)據(jù)沒有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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市点额,隨后出現(xiàn)的幾起案子舔株,更是在濱河造成了極大的恐慌,老刑警劉巖还棱,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件载慈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡珍手,警方通過查閱死者的電腦和手機(jī)办铡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琳要,“玉大人寡具,你說我怎么就攤上這事≈刹梗” “怎么了童叠?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)孔厉。 經(jīng)常有香客問我拯钻,道長(zhǎng),這世上最難降的妖魔是什么撰豺? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任粪般,我火速辦了婚禮,結(jié)果婚禮上污桦,老公的妹妹穿的比我還像新娘亩歹。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布小作。 她就那樣靜靜地躺著亭姥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顾稀。 梳的紋絲不亂的頭發(fā)上达罗,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音静秆,去河邊找鬼粮揉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛抚笔,可吹牛的內(nèi)容都是我干的扶认。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼殊橙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼辐宾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起膨蛮,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叠纹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鸽疾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吊洼,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡训貌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年制肮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片递沪。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豺鼻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出款慨,到底是詐尸還是另有隱情儒飒,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布檩奠,位于F島的核電站桩了,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏埠戳。R本人自食惡果不足惜井誉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望整胃。 院中可真熱鬧颗圣,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蔽午,卻和暖如春易茬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背及老。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工疾呻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人写半。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓岸蜗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親叠蝇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子璃岳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容