记录一下自己在 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找不到(貌似叫这个)
咋回事啊,老夫当时就有点纳闷,后来发现是需要安装一个客户端
于是,老夫就去下了一个客户端
解压,配置环境变量,一切是那么的熟悉
然后,继续启动
Unable to acquire Oracle environment handle
???咋回事啊,不是说配置好环境变量就行了吗
老夫左思右想,百度多次,终于从几篇类似的博客中明白了一些道理
哦,也许是客户端和cx_Oracle版本不一致
于是,老夫重新下载了一个版本
一切照旧,解压,配置环境变量,重启IDEA(这里着重说明一下,环境变量修改后要重启idea,不然可能还会像修改环境变量之前的状态)
然而,依旧是那熟悉而又厌恶的
Unable to acquire Oracle environment handle
中间隔了很长的时间,做了很多尝试,诸如:
a.可能是老夫环境变量写错了
b.可能是代码写错了
c.可能是版本不一致,重新换一个新的客户端
d.可能是今天天气不行
尝试无果以后,老夫在学习群中发出了求助,在三又二分之一分钟后,终于有一个热心的群友回答了我的问题
他潇洒地扔给了我一个网址,说拿去吧
???我是在求助学习问题啊,大锅
大锅说,我知道啊,这个坑我以前也踩过,但是在这个网址中下载了东西后,就莫名其妙地成功了。
我怀着期盼的心情打开了网址(就是上面的那个cx_Oracle网址)
打开后发现,这不是我最早的时候安装的cx_Oracle吗,我不是安装成功了吗
我带着怀疑的态度敲下了键盘:大锅,你这个cx_Oracle的版本还没我的高哎
大锅从容不迫地说:你就试一下喽,多试几个重新安装cx_Oracle,我当初就是试出来的。
点击下载,我选择了
安装,然后在idea中删除原先的cx_Oracle,选用刚刚下载的
运行,发现
代码在这,很简单的一段:
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中(配置进去的,纯忽悠人)
就是这样,感谢大家的阅读。