window下使用python import cx_Oracle时报错

    最近几天研究python如何连接oracle数据库,在linux下可以完美解决,root下使用源码安装即可(注意把oracle的环境变量加上),但是在windows下安装出现了问题。

python我使用的是python3.4.4,cx_Oracle为5.2.1,结果安装成功后导入时报错:


<span style="font-family:KaiTi_GB2312;font-size:14px;">在python下输入:
import cx_Oracle

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    import cx_Oracle
ImportError: DLL load failed: %1 不是有效的 Win32 应用程序</span>

一开始查资料,说是版本不一致,要么python跟cx_Oracle都是32位,要么都是64位,后来检查了下,发现都是64位的,没有理由再报错啊。


再细看报错 DDL load failed,突然想到python在连接数据库时需要调用oracle客户端的库文件(oci.dll),他们之间的版本也要一致,果不其然。

查询了下oracle客户端的版本,发现是32位的,果断安装64位客户端,然后再次导入ox_Oracle模块,成功,如下:

<span style="font-family:KaiTi_GB2312;font-size:14px;">C:\Users\md>python
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 20:20:57) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>></span>
连接成功后可以执行数据库操作了,oh yeah!
<span style="font-family:KaiTi_GB2312;font-size:14px;">>>> cx_Oracle.clientversion()
(11, 2, 0, 1, 0)
>>> db=cx_Oracle.connect('system','oracle','192.168.56.10:1521/orcl')
>>> print (db.version)
11.2.0.4.0
>>> cr = db.cursor()
>>> sql = 'select open_mode from v$database'
>>> cr.execute(sql)
<cx_Oracle.Cursor on <cx_Oracle.Connection to system@192.168.56.10:1521/orcl>>
>>> rs=cr.fetchall()
>>> print (rs)
[('READ WRITE',)]
>>></span>

综上,我们使用python通过cx_Oracle模块连接Oracle时,一定要注意保证三者(python,cx_Oracle,Oracle客户端)版本对应,位数一致



补充一下三者位数不一致的影响,近期发现(2017/8/31):

原版本:

Python3.6.1 64bit

cx_Oracle 6.0.1 64bit

oracle客户端 11.2.0.4 32bit

发现在建立到db的连接语句时报错:

db = cx_Oracle.connect(username,passwd,dsn)
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 95-96: invalid continuation byte

本来以为是字符集nls_lang问题,后来发现其实数据库没有连接时(oracle关闭时也是会报错的)


最后换了oracle客户端为12.2.0.1 bit64位,一切正常




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值