记录一下自己在 Windows 环境下安装 cx_Oracle走过的坑 (Unable to acquire Oracle environment handle)

原材料:

cx_Oracle

oracle客户端(或简端)例如:instantclient_12_1

这里切记:

1.如果你在win的环境下是有Oracle数据库的,那就不必要安装Oracle客户端(也就是oracle instant client)了。

只需要将cx_Oracle安装好就行了。

2.如果没有Oracle数据库,像老夫一样,Oracle数据库在远程的服务器上面,那就需要安装客户端了,但是,这里安装客户端也有很大的讲究。

经过老夫这一下午的折腾,发现cx_Oracle的版本最好是和客户端版本一致,实在对应不上,就换一个较低版本的cx_Oracle。

这里是cx_Oracle的下载地址:cx_Oracle包下载地址 

这里是客户端的下载地址:客户端的下载地址

这里就要开始讲一下老夫这一下午惊天地泣鬼神的骚操作了

-------------------------------------------------------------假装有分割线的样子-------------------------------------------------------------------------------

1.老夫先是使用pip install cx_Oracle

然后import cx_Oracle的时候发现没有报错,当时老夫还以为自己成功了。

2.在测试数据库连接的时候,发现:

OCI.dll找不到(貌似叫这个)

咋回事啊,老夫当时就有点纳闷,后来发现是需要安装一个客户端

于是,老夫就去下了一个客户端

记录一下自己在 Windows 环境下安装 cx_Oracle走过的坑 (Unable to acquire Oracle environment handle)

解压,配置环境变量,一切是那么的熟悉

然后,继续启动

Unable to acquire Oracle environment handle

???咋回事啊,不是说配置好环境变量就行了吗

老夫左思右想,百度多次,终于从几篇类似的博客中明白了一些道理

哦,也许是客户端和cx_Oracle版本不一致

于是,老夫重新下载了一个版本

记录一下自己在 Windows 环境下安装 cx_Oracle走过的坑 (Unable to acquire Oracle environment handle)

一切照旧,解压,配置环境变量,重启IDEA(这里着重说明一下,环境变量修改后要重启idea,不然可能还会像修改环境变量之前的状态)

然而,依旧是那熟悉而又厌恶的

Unable to acquire Oracle environment handle

中间隔了很长的时间,做了很多尝试,诸如:

a.可能是老夫环境变量写错了

b.可能是代码写错了

c.可能是版本不一致,重新换一个新的客户端

d.可能是今天天气不行

 

尝试无果以后,老夫在学习群中发出了求助,在三又二分之一分钟后,终于有一个热心的群友回答了我的问题

他潇洒地扔给了我一个网址,说拿去吧

???我是在求助学习问题啊,大锅

大锅说,我知道啊,这个坑我以前也踩过,但是在这个网址中下载了东西后,就莫名其妙地成功了。

我怀着期盼的心情打开了网址(就是上面的那个cx_Oracle网址)

打开后发现,这不是我最早的时候安装的cx_Oracle吗,我不是安装成功了吗

我带着怀疑的态度敲下了键盘:大锅,你这个cx_Oracle的版本还没我的高哎

大锅从容不迫地说:你就试一下喽,多试几个重新安装cx_Oracle,我当初就是试出来的。

点击下载,我选择了记录一下自己在 Windows 环境下安装 cx_Oracle走过的坑 (Unable to acquire Oracle environment handle)

安装,然后在idea中删除原先的cx_Oracle,选用刚刚下载的

记录一下自己在 Windows 环境下安装 cx_Oracle走过的坑 (Unable to acquire Oracle environment handle)

运行,发现

记录一下自己在 Windows 环境下安装 cx_Oracle走过的坑 (Unable to acquire Oracle environment handle)

代码在这,很简单的一段:

import cx_Oracle

conn = cx_Oracle.connect('用户名/密码@监听(ip+端口)/实例名', encoding="utf-8")  # 连接数据库
c = conn.cursor()  # 获取cursor
x = c.execute('select sysdate from dual')  # 使用cursor进行各种操作
data = x.fetchone()
print data
c.close()  # 关闭cursor
conn.close()  # 关闭连接

纳尼,居然成功了???

群里的大佬果真是深藏不露啊

总结一下这次的踩坑史重要部分:

主要原因还是cx_Oracle和oracle instant client的版本不一致(亲测:我是换用了低版本的cx_Oracle,高版本的客户端都能成功)

只需要在环境变量path中将oracle instant client的路径配置进去,不需要将oci.dll, oraociei10.dll, oraocci10.dll等任何文件拷贝到site-package中(配置进去的,纯忽悠人)

就是这样,感谢大家的阅读。