Python3.6连接Oracle 10G图解指南
Python连接Oracle相对mysql等其它数据库会麻烦一些,需要增加Oracle_client libraries这层连接。
如下图:
其中最容易出现问题是Python解析器、cx_oracle扩展模块、Oracle client三者使用的版本一致性。比如:都是win64位程序,这点很重要。
官网图解
1、Python解析器版本:
dos命令行执行Python,得知3.6 win AMD64位版本
2、Cx_oracle
Cx_oracle是Python访问Oracle的扩展模块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下执行:
pip install cx_Oracle-8.2.1-cp36-cp36m-win_amd64.whl
具体使用参考文档
https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html#overview
数据库连接、增删改查等。
3、Oracle Client
Oracle Client Libraries是Oracle client的精简版,如果本机安装了和cx_oracle版本匹配的Oracle客户端,可以直接使用。
有关认证配置,请参阅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数字会不同)
oraociei12.dll(不同版本12数字会不同)。
client libraries也称之为instant client
详情见:
https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html
下载地址:
https://www.oracle.com/database/technologies/instant-client/downloads.html
注意,如果使用12.1,需要vc++ 2010,其它版本也有对应的vc要求。
下载地址:
https://www.microsoft.com/en-us/download/details.aspx?id=26999
使用 Oracle 客户端库
详细参考文档:https://cx-oracle.readthedocs.io/en/latest/user_guide/initialization.html#using-cx-oracle-init-oracle-client-to-set-the-oracle-client-directory
方式1:在程序中指定client目录
程序中指定解压后client libraries的位置和tnsnames.ora文件目录
################# 连接方法1:直接指定tnsnames位置 #######################
cx_Oracle.init_oracle_client(lib_dir=r"D:\dev\tools\oracle\instantclient_12_1")
## client 12.1 使用tnsnames文件别名链接
db = cx_Oracle.connect('scott/scott@orcl')
config_dir 可以不指定,默认查找 lib_dir下面的 \network\admin\tnsnames.ora
方式2: 使用win环境变量
配置Oracle client目录到path环境变量
经过上述步骤,Python连接Oracle环境配置就OK了,最后需要注意工程的Python解析器必须和上述配置的解析器是同一个,PyCharm Community2020版本会在当前工程自动创建Python环境。
4、Oracle Database
验证版本信息:select * from v$version
常见错误
DPI-1047版本不一致
错误cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library
原因:python,cx_oracle和oracle客户端的位数不一致。
解决方案:使用1中提到的一致版本。
ORA-12154: TNS
cx_Oracle.DatabaseError: ORA-12154: TNS: 无法解析指定的连接标识符
原因1:
连接串参数错误
解决方案:
cx_oracle7和8下使用连接有差异:
## cx_oracle8.2 使用tnsnames文件别名链接(对应 instant client 12.1 )
db = cx_Oracle.connect('scott/scott@orcl')
# cx_oracle7 使用下面的连接写法 (对应 instant client 11.2)
# db = cx_Oracle.connect('scott/scott@192.168.159.100:1521/orcl')
print("oracle版本:", db.version)
原因2:目录无读写权限,
如程序中指定的lib_dir无权限
cx_Oracle.init_oracle_client(lib_dir=r"D:\dev\tools\oracle\instantclient_12_1")
解决方案:修改权限,文件夹-属性-安全,修改权限