Python3.6連接Oracle 10G圖解指南
Python連接Oracle相對mysql等其它數(shù)據(jù)庫會麻煩一些,需要增加Oracle_client libraries這層連接。
如下圖:
其中容易出現(xiàn)問題是Python解析器、cx_oracle擴(kuò)展模塊、Oracle client三者使用的版本一致性。比如:是win64位程序,這點(diǎn)很重要。
官網(wǎng)圖解
1、Python解析器版本:
dos命令行執(zhí)行Python,得知3.6 win AMD64位版本
2、Cx_oracle
Cx_oracle是Python訪問Oracle的擴(kuò)展模塊module,在程序中需要import的模塊。安裝方法:
1、自動安裝:
pip install cx-oracle
cx_Oracle 8.2新版,支持Python3.6到3.9版本。
2、手工安裝:
(1)從pypi下載包:
https://pypi.org/project/cx-Oracle/#files
(2)Dos下執(zhí)行:
pip install cx_Oracle-8.2.1-cp36-cp36m-win_amd64.whl
數(shù)據(jù)庫連接、增刪改查等。
3、Oracle Client
Oracle Client Libraries是Oracle client的精簡版,如果本機(jī)安裝了和cx_oracle版本匹配的Oracle客戶端,可以直接使用。
有關(guān)認(rèn)證配置,請參閱Oracle Support的Doc ID 207303.1。
總之,Oracle Client Libraries:
21可以連接到Oracle Database 12.1或更高版本。
19、18和12.2可以連接到Oracle Database 11.2或更高版本。
12.1可以連接到Oracle Database 10.2或更高版本。
11.2可以連接到Oracle Database 9.2或更高版本。
client中重要3個文件:
oci.dll(重要文件)
oraocci12.dll(不同版本12數(shù)字會不同)
oraociei12.dll(不同版本12數(shù)字會不同)。
client libraries也稱之為instant client
注意,如果使用12.1,需要vc++ 2010,其它版本也有對應(yīng)的vc要求。
使用 Oracle 客戶端庫
方式1:在程序中指定client目錄
程序中指定解壓后client libraries的位置和tnsnames.ora文件目錄
################# 連接方法1:直接指定tnsnames位置 #######################
cx_Oracle.init_oracle_client(lib_dir=r"D:\devools\oracle\instantclient_12_1")
## client 12.1 使用tnsnames文件別名鏈接
db = cx_Oracle.connect('scott/scott@orcl')
config_dir 可以不指定,默認(rèn)查找 lib_dir下面的 \network\adminnsnames.ora
方式2: 使用win環(huán)境變量
配置Oracle client目錄到path環(huán)境變量
經(jīng)過上述步驟,Python連接Oracle環(huán)境配置就OK了,需要注意工程的Python解析器必須和上述配置的解析器是同一個,PyCharm Community2020版本會在當(dāng)前工程自動創(chuàng)建Python環(huán)境。
4、Oracle Database
驗(yàn)證版本信息:select * from v$version
常見錯誤
DPI-1047版本不一致
錯誤cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library
原因:python,cx_oracle和oracle客戶端的位數(shù)不一致。
解決方案:使用1中提到的一致版本。
ORA-12154: TNS
cx_Oracle.DatabaseError: ORA-12154: TNS: 無法解析指定的連接標(biāo)識符
原因1:
連接串參數(shù)錯誤
解決方案:
cx_oracle7和8下使用連接有差異:
## cx_oracle8.2 使用tnsnames文件別名鏈接(對應(yīng) instant client 12.1 )
db = cx_Oracle.connect('scott/scott@orcl')
# cx_oracle7 使用下面的連接寫法 (對應(yīng) instant client 11.2)
# db = cx_Oracle.connect('scott/scott@192.168.159.100:1521/orcl')
print("oracle版本:", db.version)
原因2:目錄無讀寫權(quán)限,
如程序中指定的lib_dir無權(quán)限
cx_Oracle.init_oracle_client(lib_dir=r"D:\devools\oracle\instantclient_12_1")
解決方案:修改權(quán)限,文件夾-屬性-安全,修改權(quán)限